AJと若松通商さんのキット

作成: 2005-01-12 00:56:17 (水)
更新: 2005-10-13 23:11:13 (木)
参照: 6386

#contents



CGIでprintenvでの空きメモリ

  • 2005-10-13:下の方にあるprintenvを動かすと、空きメモリが少ないのが気になる。
  • freeした結果と同じだが、distのバージョンかコンフィグ設定によって一時期は増えていた気がする。
  • 8MBの内4MBぐらい空きのはず。(最新distで確認要)


20005-09-03: 以下記事は旧distを基にしています。

Armadillo-JでCGIを試行

  • Armadillo-Jで、thttpd -d /home/www -c 'cgi-bin/*' & によるCGI動作を確認した。

起動条件

  • 開発環境として、Cygwinでのクロス開発環境を使用した。
    • cygwinのDLLバージョン:
      $ uname -r
      1.5.12(0.116/4/2)

参照先

試行時バイナリとソースコード: filecgi_demo-printenv.lzh filecgi_generic.lzh fileprintenv.lzh

※cgi_demoとprintenvはHiddenファイル属性
haneWIN NFS Serverで実行可能(+x)とするため)


CGI(その1):ポート出力とステータスLED (上記参照の上で一部変更) 起動時

armadillo-j_cgi_relay_led.png
  • template.c において、if(form_method == POST) { をブラウザ情報のポート出力反映処理に追加した。
    • ※ブラウザ起動時の配列ポインタエラー回避のため
/* template.c */

#include <fcntl.h>
#include <stdio.h>

#include "cgivars.h"
#include "htmllib.h"

#define DEBUG		1

#define pcra (*(unsigned int*)0xffb00020)	//IOポートA レジスタ定義
#define pcrc (*(unsigned int*)0xffb00028)	//IOポートC レジスタ定義

int template_page(char **postvars, int form_method) {
	int i;
	int j = 0;
	
	int fd = 0;
	int data = 0;

	// LEDデバイス オープン
	if((fd = open("/dev/ajled", O_RDWR)) < 0){
		fprintf( stderr, "Open error.\n" );
		return -1;
	}

	// DCD/PORT0のモードをGPIOモードにする
	pcra &=  ~0x01000000;
	// DCD/PORT0のディレクションを出力する
	pcra |=  0x00010000;

	// webページのタイトルを変更
	//addTitleElement("Demo CGI");
	addTitleElement("Armadillo-J");
	addTitleElement("Relay Control Demo");

	if(form_method == POST) {
		for (i=0; postvars[i]; i+= 2) {
#if DEBUG
			printf("<li>DEBUG: [%s] = [%s]\n", postvars[i], postvars[i+1]);
#endif
		}
	}

	if(form_method == POST) {
		// ブラウザからの情報をポート出力に反映する
		if(strcmp(postvars[j],"port")==0)       {
			if(strcmp(postvars[j+1],"1")==0) {
				pcra &= ~0x01;
				// LEDを点灯
				//data = 1;
				//write(fd, &data, 1);
			}else {
				pcra |= 0x01;
				// LEDを消灯
				//data = 0;
				//write(fd, &data, 1);
			}
		}
	}

	// 出力ポートの状態をSTS LEDに反映する
	if(pcra&0x01)
		pcrc |= 0x20;
	else
		pcrc &= ~0x20;

	// 現在のLEDの状態を取得
	read(fd, &data, 1);
	printf("<li>current state:0x%02X\n", data);

	/* GET */
	printf("<BR>\n");
	printf("<FORM ACTION=\"%s\" METHOD=POST>\n", "/cgi-bin/cgi_demo");

	printf("<SELECT NAME=\"port\">\n");
	// 出力ポートの状態をwebページに反映
	printf("<OPTION VALUE=\"0\" %s>OFF\n",(pcra&0x01)?"SELECTED":"");
	printf("<OPTION VALUE=\"1\" %s>ON\n",(pcra&0x01)?"":"SELECTED");
	//printf("<OPTION VALUE=\"0\" %s>OFF\n",(data&0x01)?"SELECTED":"");
	//printf("<OPTION VALUE=\"1\" %s>ON\n",(data&0x01)?"":"SELECTED");
	printf("</SELECT>\n");

	printf("</TD></TR>\n");
	printf("<BR><BR>\n");
	printf("<INPUT TYPE=submit VALUE=\"Submit\">\n");
	printf("<INPUT TYPE=reset VALUE=\"Reset\">\n");
	printf("</FORM>\n");

	close(fd);
	return 0;
}

CGI(その2): printenvの起動時

armadillo-j_cgi_printenv.png
  • ソースコード: printenv.c
    //-------------------------------
    // トランジスタ技術 2002年8月号
    //  L-Card+ 成松殿 記事より
    //  (一部処理追加)
    //-------------------------------
    
    #include <stdio.h>
    
    #define ERROR   ((int)-1)
    #define NORMAL  ((int) 0)
    #define FALSE   ((int) 0)
    #define TRUE    ((int) 1)
    
    int main()
    {
    	extern char **environ;
    	char **pp;
    	char *header[]={
    	"Content-type: text/html",
    	"",
    	"<html>",
    	"<head><title>printenv</title></head>",
    	"<body bgcolor=\"#fff0f0\">",
    	NULL};
    	char *trailer[]={
    	"</body>",
    	"</html>",
    	NULL,
    	};
    
    	for(pp=header;*pp;pp++)
    		printf("%s\r\n",*pp);
    	for(pp=environ; *pp;pp++)
    		printf("%s<br>\r\n",*pp);
    
    	if (file_read("/proc/meminfo") == ERROR)
    		exit(1);		// 異常終了
    
    	for(pp=trailer;*pp;pp++)
    		printf("%s\r\n",*pp);
    
    	return NORMAL;
    }
    
    //---------------------
    // ファイル読込み関数
    //---------------------
    int file_read(char *fname) {
    	FILE *fp;
    	char s[256];
    	int	i;
    
    	if ((fp = fopen(fname, "r")) == NULL) {
    		printf("file open error!!\n");
    		return ERROR;
    	}
    
    	printf("<hr>\r\n");
    	while (fgets(s, 256, fp) != NULL) {
    		printf("%s<br>\n", s);
    	}
    	fclose(fp);
    	return NORMAL;
    }

添付ファイル: fileprintenv.lzh [詳細] filecgi_demo-printenv.lzh [詳細] filecgi_generic.lzh [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Thu, 13 Oct 2005 23:11:13 JST (4180d)