yano@ML110G7:~/software/fplug_for_linux$ sudo `fptest`
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->1
Temp Command:10,81,00,00,0E,F0,00,00,11,00,62,01,E0,00,
ret size=**15**
**Temp Status:10,81,00,00,00,00,0E,F0,00,72,01,E0,02,0E,01,**
Temperature=27.0
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->4
ret size=16
Realtime Wattmeter:10,81,00,00,00,22,00,0E,F0,00,72,01,E2,02,73,02,
Watt(Realtime)=62.7W
fpstatusもsensors.cronからデータを取得できるよう同様に改修してみたのだが、応答メッセージの受信以前に要求メッセージの送信がうまくいかない事が多い事がわかった。調べてみると"Transport endpoint is not connected"が発生しているので、ENOTCONNの場合はwriteをリトライするように対処。
ついでに一度の接続で電力、温度、湿度、照度を立て続けに取得できるように改造。
#include <stdint.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include "fplug.h"
#define DEOJ_TOKEN "\x0E\xF0\x00\x72"
#define DEOJ_TOKEN_LEN 4
static unsigned char *
memmem(unsigned char *a, size_t a_len, unsigned char *b, size_t b_len)
{
int i;
for (i = 0; i < (a_len - b_len); i++ ){
if ( a[i] != *b )
continue;
if ( !memcmp(&a[i], b, b_len) )
return &a[i];
}
return NULL;
}
static void dump_message( char *mes, unsigned char *buf, int size )
{
/*
int cnt;
printf( "%s", mes );
for ( cnt=0; cnt<size; cnt++ ) {
printf( "%02X,", buf[cnt] );
}
printf( "\n" );
*/
return;
}
int fp_main( int, int );
int main(int argc, char *argv[])
{
int fd;
struct termios oldtio, newtio;
char *cmd;
if ( argc == 1 ) {
printf("Usage: fpstatus <option>\n");
return(0);
}
if ( *argv[1] == '-' ) argv[1]++;
fd = open(SERIAL_PORT, O_RDWR);
if ( fd < 0 ){
perror("open(/dev/rfcomm0)");
return 0;
}
tcgetattr( fd, &oldtio );
newtio = oldtio;
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
tcsetattr(fd, TCSANOW, &newtio);
for ( cmd = argv[1]; cmd && *cmd; cmd++ )
fp_main(fd, *cmd);
printf( "\n");
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
return 0;
}
typedef unsigned char uchar;
size_t fplug_request(int fd, uchar *req_buf,size_t req_len,uchar *res_buf, size_t bufsiz)
{
struct timespec tmspec = { 0, 1000 * 1000 };
int ret, i;
dump_message( "Command:", req_buf, req_len);
for (ret = i = 0;i < 10; i++ ) {
tmspec.tv_nsec = i * 100 * 1000 * 1000;
ret = write(fd, req_buf, req_len);
if ( ret == req_len )
break;
// printf("write()=%d,errno=%d\n", ret, errno);
switch ( errno ){
case ENOTCONN :
nanosleep(&tmspec, NULL);
break;
}
}
ret = read(fd, res_buf, bufsiz);
dump_message( "read:", res_buf, ret );
return ret;
}
int fp_main( int fd, int mode )
{
int cmd;
int cnt;
int a=0;
double f;
int ret;
int i=0;
unsigned char buf[BUFSIZ];
time_t timer;
struct tm *t;
switch(mode) {
case 't':
while (1) {
ret = fplug_request(fd, Temp, sizeof(Temp), buf, BUFSIZ);
if (memmem(buf, ret, DEOJ_TOKEN, DEOJ_TOKEN_LEN)) break;
if ( i++ >10 ) return(0);
}
a = *(int16_t *)&buf[ret-2];
printf( "FP_TEMP=%.1f;", (float)a / 10);
break;
case 'h':
while (1) {
ret = fplug_request(fd, Humid, sizeof(Humid), buf, BUFSIZ);
if (memmem(buf, ret, DEOJ_TOKEN, DEOJ_TOKEN_LEN)) break;
if ( i++ >10 ) return(0);
}
a = *(uint16_t *)&buf[ret-2];
printf( "FP_HUMID=%d;", a );
break;
case 'i':
while (1) {
ret = fplug_request(fd, Illum, sizeof(Illum), buf, BUFSIZ);
if (memmem(buf, ret, DEOJ_TOKEN, DEOJ_TOKEN_LEN)) break;
if ( i++ >10 ) return(0);
}
a = *(uint16_t *)&buf[ret-2];
printf( "FP_ILLUM=%d;", a );
break;
case 'w':
while (1) {
ret = fplug_request(fd, RWatt, sizeof(RWatt), buf, BUFSIZ);
if (memmem(buf, ret, DEOJ_TOKEN, DEOJ_TOKEN_LEN)) break;
if ( i++ >10 ) return(0);
}
a = *(uint16_t *)&buf[ret-2];
printf( "FP_WATT=%.1f;", (float)a / 10);
break;
default:
break;
}
}
しかし、『宮崎駿監督作品集』の「特典ディスク」に含まれるプロモーションフィルム『On Your Mark』(約7分)まで問題視し排除するというディズニーのスタンスには激しく納得がいかない。
先日、春日市の小学校の校長先生が覚せい剤所持容疑で逮捕されるというショッキングな事件があったが、その余波で作曲した校歌を変更する動きが出ているらしい。事件の余波で容疑者が儲かるような構図は許せないので、ASKA自身が中心となっている「CHAGE and ASKA」作品やソロ作品を出荷停止というのは「相応の罰」として理解できるが、どんな経緯で「校歌が相応しくない」という考えになるのだろうか。事件によって万里の河を始めとした名曲の数々が色褪せる事は全く無く、楽曲の良し悪しと作曲者や作詞者の人格なんて全く関係無いとさえ思うよ。
yano@ML110G7:~$ apt-get install `bluez bluez-compat bluez-utils`
yano@ML110G7:~$ hciconfig hci0
hci0: Type: BR/EDR Bus: USB
BD Address: 00:1B:DC:AA:BB:CC ACL MTU: 310:10 SCO MTU: 64:8
UP RUNNING PSCAN
RX bytes:512 acl:0 sco:0 events:24 errors:0
TX bytes:343 acl:0 sco:0 commands:23 errors:0
yano@ML110G7:~$ `hcitool` scan
Scanning ...
**B0:99:28:XX:YY:ZZ** F-PLUG
yano@ML110G7:~$ sudo `bluetooth-agent` 1234 **B0:99:28:XX:YY:ZZ**
Pincode request for device /org/bluez/19037/hci0/dev_B0_99_28_XX_YY_ZZ
Agent has been released
yano@ML110G7:~$ sudo `l2ping` **B0:99:28:XX:YY:ZZ**
Ping: **B0:99:28:XX:YY:ZZ** from 00:1B:DC:AA:BB:CC (data size 44) ...
0 bytes from **B0:99:28:XX:YY:ZZ** id 0 time 31.79ms
0 bytes from **B0:99:28:XX:YY:ZZ** id 1 time 22.40ms
0 bytes from **B0:99:28:XX:YY:ZZ** id 2 time 26.03ms
^C3 sent, 3 received, 0% loss
yano@ML110G7:~$ sudo `rfcomm` -r connect hci0 **B0:99:28:XX:YY:ZZ** &
[1] 3427
yano@ML110G7:~$ Connected /dev/rfcomm0 to **B0:99:28:XX:YY:ZZ** on channel 1
**Press CTRL-C for hangup**
yano@ML110G7:~$
yano@ML110G7:~/software$ git clone https://github.com/goto2048/fplug_for_linux.git
yano@ML110G7:~/software$ cd ~/software/fplug_for_linux/
yano@ML110G7:~/software/fplug_for_linux$ make fptest
cc fptest.c -o fptest
fptest.c: In function ‘testmenu’:
fptest.c:66:17: warning: unknown conversion type character 0xa in format [-Wformat=]
printf( "Humidity=%d%\n", a );
^
fptest.c: In function ‘dump_message’:
fptest.c:96:5: warning: format not a string literal and no format arguments [-Wformat-security]
printf( mes );
^
yano@ML110G7:~/software/fplug_for_linux$ make fpstatus
cc fpstatus.c -o fpstatus
yano@ML110G7:~/software/fplug_for_linux$ sudo ./fptest
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->1
Temp Command:10,ffffff81,00,00,0e,fffffff0,00,00,11,00,62,01,ffffffe0,00,
ret size=16
Temp Status:10,ffffff81,00,00,00,11,00,0e,fffffff0,00,72,01,ffffffe0,02,fffffff0,00,
Temperature=**24.0**
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->4
ret size=16
Realtime Wattmeter:10,ffffff81,00,00,00,22,00,0e,fffffff0,00,72,01,ffffffe2,02,00,00,
Watt(Realtime)=**0.0W**
1.Get Temperature
2.Get Humidity
3.Illumination
4.Watt(Realtime)
5.Exit
Input command no ->5
yano@ML110G7:~/software/fplug_for_linux$ sudo cp -p {fptest,fpstatus} /usr/local/bin/
yano@ML110G7:~/software/fplug_for_linux$