Armadillo-400シリーズで下記のようにWebページ上で表とグラフを表示するサンプルデモを作ってみた。
備考)Webブラウザはcanvasに対応している必要がある。 当方の確認では、Firefox、IE、Chromeのいずれも上記の写真のように表示されることを確認した。
1.まず、表の要素となるデータを出力するスクリプト"rand_data"を作成。
rand_data
rm -f /tmp/log.txt
rm -f /home/www-data/log20.txt
touch /tmp/log.txt
touch /home/www-data/log20.txt
for i in `seq 1 1000`
do
echo -n `date +"%Y/%m/%d %p %I:%M:%S"` >> /tmp/log.txt
echo -n ',' >> /tmp/log.txt
echo -n $((RANDOM % 100)) >> /tmp/log.txt
echo -n ',' >> /tmp/log.txt
echo $((RANDOM % 100)) >> /tmp/log.txt
tail -n 20 /tmp/log.txt > /home/www-data/log20.txt
sleep 1
done
このスクリプトは、1秒毎に 日付,乱数,乱数 という形式で、 /tmp/log.txt に1000回まで出力する。 うち、最新の20行が /home/www-data/log20.txt に出力される。
2.Webページに表を作るプログラムをCGIで作成。
ArmadilloをCGIで制御するサンプル(LED点灯) のredled.cを改造して、下記のような"graph_demo.c"を作成する。 graph_demo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE *fp;
char str[25][30];
int val1[25], val2[25];
char str1[10], str2[10];
int ret;
int i, j;
int row_max;
int x1, y1;
char str0[30];
int str_copy_len = 0;
/**** log read: begin ****/
for(i = 0; i < 25; i++)
for(j = 0; j < 30; j++)
str[i][j] = '\0';
fp = fopen("/home/www-data/log20.txt", "rt");
if( fp == NULL ){
printf( "cannot open /home/www-data/log20.txt\n");
return -1;
}
i = 0;
while((ret = fscanf( fp, "%[^,],%d,%d", str[i], &val1[i], &val2[i])) != EOF
&& i < 20) {
fgetc(fp);
i++;
}
row_max = i - 1;
fclose(fp);
/**** log read: end ****/
puts(
"Content-type: text/html\n"
"\n"
"<HTML>\n"
"<HEAD>\n"
"<TITLE> Armadillo-440 </TITLE>\n"
"</HEAD>\n"
"<BODY>\n"
);
//system("echo 1 > /sys/class/leds/red/brightness");
//system("sleep 1");
//system("echo 0 > /sys/class/leds/red/brightness");
/**** table: begin ****/
puts(
"<TABLE border=\\"1\\" align=\\"left\\">\n"
);
puts(
"<TR>\n"
"<TD>時刻</TD>\n"
"<TD>乱数1</TD>\n"
"<TD>乱数2</TD>\n"
"</TR>\n"
);
for(i = 0; i < row_max && i < 20; i++) {
sprintf(str1, "%d", val1[i]);
sprintf(str2, "%d", val2[i]);
puts(
"<TR>\n"
"<TD>"
);
puts(str[i]);
puts(
"</TD>\n"
"<TD>"
);
puts(str1);
puts(
"</TD>\n"
"<TD>"
);
puts(str2);
puts(
"</TD>\n"
"</TR>\n"
);
}
puts(
"</TABLE>\n"
);
/**** table: end ****/
/**** graph: begin ****/
puts("<canvas width=\\"480\\" height=\\"480\\" id=\\"sample\\" style=\\"background-color:yellow;\\">\n");
puts("</canvas>\n");
puts(
"<script type=\\"text/javascript\\">\n"
"var canvas = document.getElementById('sample');\n"
"if (canvas.getContext) {\n"
" var context = canvas.getContext('2d');\n"
" canvas.style.position = \\"absolute\\";\n"
" canvas.style.left = \\"300px\\";\n"
" canvas.style.top = \\"10px\\";\n"
" context.beginPath();\n"
/**** graph: graph area ****/
" context.moveTo(40, 50);\n"
" context.lineTo(40, 250);\n"
" context.lineTo(440, 250);\n"
" context.lineTo(440, 50);\n"
" context.closePath();\n"
" context.fillStyle = \\"rgb(255, 255, 255)\\";\n"
" context.strokeStyle = \\"rgb(0, 0, 0)\\";\n"
" context.fill();\n"
" context.stroke();\n"
/**** graph: y-axis value ****/
" context.font = \\"bold 12px Century Gothic\\";\n"
" context.fillStyle = \\"rgb(0, 0, 0)\\";\n"
" context.textAlign = \\"right\\";\n"
" context.fillText(\\"100\\", 35, 50);\n"
" context.fillText(\\"50\\", 35, 150);\n"
" context.fillText(\\"0\\", 35, 250);\n"
" context.textAlign = \\"left\\";\n"
" context.fillText(\\"100\\", 445, 50);\n"
" context.fillText(\\"50\\", 445, 150);\n"
" context.fillText(\\"0\\", 445, 250);\n"
" context.save();\n"
);
/**** graph: x-axis value ****/
puts(
" context.textAlign = \\"right\\";\n"
" context.rotate(270/180*Math.PI);\n"
);
for(i = 0; i < row_max && i < 20; i++) {
y1 = 440 - (row_max - i) * 20;
x1 = -250 - 5;
sprintf(str1, "%d", x1);
sprintf(str2, "%d", y1);
for(j = 0; j < 30; j++) str0[j] = '\0';
if(strlen(str[i]) > 25) str_copy_len = 25;
else str_copy_len = strlen(str[i]);
str0[0] = '\\"';
for(j = 0; j < str_copy_len; j++) str0[j + 1] = str[i][j];
str0[str_copy_len + 1] = '\\"';
puts("context.fillText(");
puts(str0);
puts(", ");
puts(str1);
puts(", ");
puts(str2);
puts(");\n");
}
/**** graph: line graph ****/
puts(
" context.restore();\n"
" context.strokeStyle = 'rgb(0, 0, 255)';\n"
);
for(i = 0; i < row_max && i < 20; i++) {
x1 = 440 - (row_max - i) * 20;
y1 = 250 - (val1[i] * 2);
sprintf(str1, "%d", x1);
sprintf(str2, "%d", y1);
if(i == 0) {
puts("context.moveTo(");
puts(str1);
puts(", ");
puts(str2);
puts(");\n");
}
else {
puts("context.lineTo(");
puts(str1);
puts(", ");
puts(str2);
puts(");\n");
}
}
puts(
" context.stroke();\n"
"}\n"
);
puts("</script>\n");
/**** graph: end ****/
puts(
"</BODY>\n"
"</HTML>"
);
return 0;
}
備考) /**** log read: begin ****/ /**** log read: end ****/ で囲んだ箇所で、/home/www-data/log20.txtの内容を読み込んでいる。
/**** table: begin ****/ /**** table: end ****/ で囲んだ箇所で、表に表示している。
/**** graph: begin ****/ /**** graph: end ****/ で囲んだ箇所で、グラフに表示している。
/**** graph: graph area ****/ グラフの表示エリアの描画。
/**** graph: y-axis value ****/ Y軸(乱数)の目盛の描画。
/**** graph: x-axis value ****/ X軸(日付)の描画。
/**** graph: line graph ****/ 乱数1の変化を折れ線で表示。
3.ビルドをかける(実行ファイルは、graph_demo.cgiとする)
arm-linux-gnueabi-gcc graph_demo.c -o graph_demo.cgi
4.上記1,2のファイル"rand_data"、"graph_demo.cgi"をArmadilloに転送し、/home/www-dataに置く
5.実行権限をつける
[armadillo ~]# chmod +x /home/www-data/rand_data
[armadillo ~]# chmod +x /home/www-data/graph_demo.cgi
6.PCのWebブラウザで確認する。
まず、PCとArmadilloをネットワーク経由で接続し、ArmadilloのIPアドレスを確認する。
Armadillo上で
[armadillo ~]# /home/www-data/rand_data &
を実行後、PCのWebブラウザで [ArmadilloのIPアドレス]/graph_demo.cgi にアクセスすると、/home/www-data/log20.txtの内容が、Webブラウザで表とグラフになって見える。