OSDN Git Service

AFサンプルのパッキング関数を書いた
authorsuikan <suikan@users.sourceforge.jp>
Sun, 8 Mar 2015 14:40:48 +0000 (23:40 +0900)
committersuikan <suikan@users.sourceforge.jp>
Sun, 8 Mar 2015 14:40:48 +0000 (23:40 +0900)
trx305/rx_if.c

index 14efc42..038d3dd 100644 (file)
@@ -9,8 +9,8 @@
 
 static void init_sport0_rx(void);
 static void init_sport0_tx(void);
-static void pack_af_sample( int left, int right, int * word0, int * word1);
-static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int idata, int qdata );
+static void pack_af_sample( short left, short right, int * pri_ch, int * sec_ch1);
+static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata );
 static void parse_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq );
 
 
@@ -31,6 +31,12 @@ static struct {
     unsigned int af_buffer[2][AF_BUFSIZE];
 } sport_ctl;
 
+static struct {
+    int index;
+    unsigned short flags;
+    unsigned short smeter;
+} af_ctl;
+
 /**
  * \brief RX_IF受信データの処理タスク
  * \param cfgファイルから値を渡すための引数。使っていない
@@ -49,6 +55,9 @@ void rx_if_task(VP_INT exinf)
     syscall(serial_ctl_por(TASK_PORTID,
             (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
 
+    af_ctl.index = FALSE;
+    af_ctl.flags = 0;
+    af_ctl.smeter = 0;
 
         // SPORT0の送受割り込みを可能にする
     syscall(ena_int(INTNO_SPORT0_RX));
@@ -151,14 +160,79 @@ void af_task(VP_INT exinf)
 }
 
 
-static void pack_af_sample( int left, int right, int * word0, int * word1)
+/**
+ * \brief AFサンプルをパックしてデータキューに書き込みできる形式に変換する
+ * \param left  左チャンネルのオーディオデータ。[-1,1.0)の固定小数点形式
+ * \param right 右チャンネルのオーディオデータ。[-1,1.0)の固定小数点形式
+ * \param pri_ch パック済みオーディオデータ。最初にデータキューにコピーする。
+ * \param sec_ch パック済みオーディオデータ。2番めにデータキューにコピーする。
+ * \detail
+ * 与えられたステレオ・データから、データキュー書き込み用のデータを組み立てる。
+ * 書き込みデータはSPORTのプライマリ・チャンネル用、セカンダリ・チャンネル用がある。
+ * さらに、これらがindex ==0 および 1の場合に別れる。
+ *
+ * この関数はindexを af_ctrl.index で管理しており、その値に応じて適切な
+ * プライマリ・チャンネル、セカンダリ・チャンネル用のデータを組み立てる。
+ *
+ * なお、セカンダリ・チャンネルはindex = 1の時にサブ・オーディオを伝送するが、
+ * TRX-305はサブ・オーディオを使わないためこのルーチンは常に値を0としている。
+ */
+static void pack_af_sample( short left, short right, int * pri_ch, int * sec_ch)
 {
+        // オーディオデータは15bitしか使わない。Rchの16bit目は0に固定する
+    right >>= 1;        // 15bitに変換
+    right &= 0x7FFF;    // 本当はMSBは無視されるのだが、念の為0にする
+
+    left >>= 1;         //15bitに変換
+
+    if ( af_ctl.index )
+    {
+        left |= 0x8000; // MSBを1にする
+
+            // indexが1のとき、セカンダリチャンネルはサブオーディオとなっている。
+            // TRX-305はサブオーディオを使わないのでindexデータのみ送る
+        *sec_ch = 0x00008000;
+    }
+    else
+    {
+        left &= 0x7FFF;    // MSBを0にする
 
+            // indexが0のとき、セカンダリオーディオはDSPからSH2へのデータ回線である
+        *sec_ch =
+                af_ctl.smeter << 16  |
+                af_ctl.flags;           // flagsのbit15は0なので、indexも0になる
+    }
+
+        // プライマリ・チャンネルの組み立て
+    *pri_ch = (right << 16) | left;
+
+
+    af_ctl.index = ! af_ctl.index;  // indexの論理反転
 }
-static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int idata, int qdata )
+
+/**
+ * \brief ワイドFMのRX-IFデータを解析する
+ * \param pri_ch プライマリ・チャンネルからのデータ
+ * \param sec_ch セカンダリ・チャンネルからのデータ
+ * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式
+ * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式
+ * \detail
+ */
+static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata )
 {
 
 }
+
+/**
+ * \brief 非ワイドFMのRX-IFデータを解析する
+ * \param pri_ch プライマリ・チャンネルからのデータ
+ * \param sec_ch セカンダリ・チャンネルからのデータ
+ * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
+ * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
+ * \param valid_iq IQデータが有効の時真、向こうの時は偽
+ * \detail
+ */
+
 static void parse_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq )
 {