赤外線リモコン受信データ解析処理は、赤外線リモコン受信処理にて受信完了した場合にメイン処理から呼び出され、配列になっている受信データを4バイト型のデータに変換します。
赤外線リモコン受信データ解析処理の概要
配列になっている受信データは、LSBファーストになっています。これを4バイト型のデータに変換する前にどのように入れ替えが行われているかを図に示します。
最初の受信データ[0]は、1バイト目のビット0に格納します。次の受信データ[1]は、1バイト目のビット1に格納します。このように、最初の受信データが最下位ビット(一番右側にあるビット)を表しています。最下位ビットのことをLSBと呼び、最初のデータが最下位ビットになっていることをLSBファーストと呼びます。
解析後データの4バイトに入れるデータは、図にあるようなイメージで格納していきます。
解析後の4バイト型データに格納した後は、呼び出し元にその値を返します。
赤外線リモコン受信データ解析処理は、この解析を行うのみとなります。
赤外線リモコン受信データ解析処理の実装
赤外線リモコン受信データ解析処理の実装は次のようになります。
#include "AppRcvDataAls.h"
#include "DrRcvCtrl.h"
#define U1S_APPRCVDATAALS_RCVDATA_SIZE ((U1)(32U))
#define U1S_APPRCVDATAALS_RCVDATA_BYTENUM ((U1)(4U))
#define U1S_APPRCVDATAALS_BIT_8 ((U1)(8U))
#define U4S_APPRCVDATAALS_BIT0_ON ((U4)(1UL))
U4 U4G_AppRcvDataAls_Main( void )
{
U1 u1l_RcvByteCnt;
U1 u1l_BitCnt;
U1 u1l_Index;
U1 u1l_BitSftNum;
U1 u1l_RcvData[ U1G_DRRCVCTRL_RCVDATA_SIZE ];
U4 u4l_BottomKind;
G_DrRcvCtrl_GetRcvData( u1l_RcvData ); /* 受信データ取得 */
u4l_BottomKind = U4_CLR; /* ボタン種別クリア */
for( u1l_RcvByteCnt = U1_CLR; u1l_RcvByteCnt < U1S_APPRCVDATAALS_RCVDATA_BYTENUM; u1l_RcvByteCnt++ )
{ /* 1バイト毎ループ(4回ループ) */
for( u1l_BitCnt = U1_CLR; u1l_BitCnt < U1S_APPRCVDATAALS_BIT_8; u1l_BitCnt++ )
{ /* 1ビット毎ループ(8回ループ) */
/* 変換元(受信データ)の対象添字を求める */
u1l_Index = u1l_BitCnt + ( u1l_RcvByteCnt * U1S_APPRCVDATAALS_BIT_8 );
/* 変換元(受信データ)の対象添字箇所の0/1を判定し、1の場合は、変換先の対象位置を1にセット */
if( u1l_RcvData[ u1l_Index ] == U1_ON )
{
/* 変換先のビットシフト位置を求める */
u1l_BitSftNum =
U1S_APPRCVDATAALS_BIT_8 * ( U1S_APPRCVDATAALS_RCVDATA_BYTENUM - u1l_RcvByteCnt - 1 ) + u1l_BitCnt;
u4l_BottomKind |= ( U4S_APPRCVDATAALS_BIT0_ON << u1l_BitSftNum );
}
}
}
return u4l_BottomKind;
}
最初のfor文は、1バイト毎にLSBファーストで格納します。それを4バイト分行うので4回ループさせます。
次のfor文は、1バイトの中で1ビット毎に格納を行っていきますので、8ビット分行う8回ループさせます。
2重ループの中で変換処理を行います。
最初に現在の添字を求めます。0から毎回+1ずつ増えていきます。(0~31まで順に変化します。)
次に変換先の4バイトデータのどこのビット位置に格納するかを計算します。格納する位置を求めるために、シフト演算を行っています。このシフト演算をいくつ左シフトするかの値を求めています。
変換先の4バイトデータに受信データを格納するまえは0で初期化しているため、受信データが 1 の場合のみシフトすればよいです。このため、シフト位置を求める前に、変換元の受信データが1かの判定条件を追加しています。
次にヘッダーファイルの実装を示します。
#ifndef APPRCVDATAALS_H
#define APPRCVDATAALS_H
#include "common.h"
#define U4G_APPRCVDATAALS_BTM_FOW (0x00FF18E7U) /* ↑ボタン */
#define U4G_APPRCVDATAALS_BTM_BCK (0x00FF52ADU) /* ↓ボタン */
#define U4G_APPRCVDATAALS_BTM_RGT (0x00FF5AA5U) /* →ボタン */
#define U4G_APPRCVDATAALS_BTM_LFT (0x00FF08F7U) /* ←ボタン */
extern U4 U4G_AppRcvDataAls_Main( void ); /* 赤外線リモコン受信データ解析処理 */
#endif
メイン処理に解析した結果のデータを返しますが、メイン側でそれがどのボタンに該当するかを判定するためにボタンの種別を定数定義して公開します。
その他は、関数プロトタイプ宣言のみです。
簡単ではありますが、赤外線リモコン受信データ解析処理の実装については以上になります。