Sirius

2011年1月13日(木) 22:12

赤外線信号の解析その2

HDUSF のリモコン信号の形式が NEC フォーマットのようなので、デコードするプログラムを考えてみました。
NEC フォーマットの詳細は、ルネサスのホームページを参照してください。
------------------------ここから------------------------
#include <stdio.h>
#include <stdlib.h>

#define bits(x) ((x) < 0 ? 0 : (buf[(x)/8]>>((x)%8))&0x1)
#define is_one(on, off)  ((on) >= 3 && (off) >= 10)
#define is_zero(on, off) ((on) >= 3 && (off) <= 9)

int main(int argc, char *argv[])
{
    FILE *fp;
    unsigned char buf[255];
    int i, on, off, count, leader, tailer;
    unsigned long code;

    if( argc != 2 ) exit(1);

    if( !(fp = fopen(argv[1], "rb")) ) exit(1);

    fread(buf, sizeof(unsigned char), 240, fp);
    fclose(fp);

    printf("%-14s ", argv[1]);
    on = off = code = count = leader = tailer = 0;
    for( i = 0 ; i < 240*8; i++ ) {
        if( bits(i) && bits(i-1) ) on++;
        else if( !bits(i) && !bits(i-1) ) {
            off++;
            if( off > 90 ) {
                tailer = 1;
                break;
            }
        } else if( !bits(i) &&  bits(i-1) ) off = 1;
        else if(  bits(i) && !bits(i-1) ) {
            if( on > 20 && off > 10 )  leader = 1;
            else if( is_one(on, off) )  code = (code<<1) + 1,count++;
            else if( is_zero(on, off) ) code = (code<<1), count++;
            on = 1;
        }
    }
    printf("code = %-8lx(%d bit) %s-%s ", code, count,
                leader ? "true " : "false", tailer ? "true " : "false");
    if( count == 32 ) {
        if( ((code>>16) & 0xff) != (~(code>>24) & 0xff) )
            printf("Vender = 0x%04x ", (code>>16)&0xffff);
        else
            printf("Vender = 0x%02x ", (code>>24)&0xff);
        if( (code & 0xff) == (~(code>>8) & 0xff) )
            printf("Data = 0x%02x\n", (code>>8)&0xff);
        else
            printf("data error\n");
    } else
        printf("\n");
}
------------------------ここまで------------------------
コードが 32bit の場合、前半 16bit がカスタムコード、後半 16bit がデータコードになります。
カスタムコードは、16bit の場合と、8bit + 反転 8bit のケースと二つあります。カスタムコードがベンダーを表します。
データコードは、8bit + 反転 8bit となります。データのエラーチェックをすることが出来ます。

実行した結果は次のようになります。
HDUS_Power     code = 50ef817e(32 bit) true -true  Vender = 0x50ef Data = 0x81
同じボタンを何回か記録して試しましたが全て同じ結果となりました。これで押されたボタンを識別できそうです。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Sirius

MySketch 2.7.2 written by 夕雨