OSDN Git Service

抽出したidata qdataの符号ビットの数を計測
[trx-305dsp/dsp.git] / trx305 / framework.c
index 551e76d..93877f6 100644 (file)
@@ -7,13 +7,13 @@
 #include <cdefBF533.h>
 
 
-#define PARAMDATA_NUM 16
 
 static void init_sport0_rx(void);
 static void init_sport0_tx(void);
 static void pack_af_sample( short left, short right, unsigned int * pri_ch, unsigned int * sec_ch);
 static void unpack_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata );
 static void unpack_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq );
+static void set_command_data( unsigned int command, unsigned int data );
 
 
 
@@ -39,11 +39,7 @@ static struct {
 } framework;
 
     // ラジオアルゴリズムとのやりとりに使う変数
- struct {
-    unsigned short flags;
-    unsigned short smeter;
-    unsigned short comdata[PARAMDATA_NUM];
-} radio;
+ struct RADIO radio;
 
 
     // デバッグ用変数群
@@ -347,7 +343,7 @@ static void pack_af_sample( short left, short right, unsigned int * pri_ch, unsi
     }
 
         // プライマリ・チャンネルの組み立て
-    *pri_ch = (right << 16) | left;
+    *pri_ch = ((unsigned int)right << 16) | (unsigned short)left;
 
 
     framework.index = ! framework.index;  // indexの論理反転
@@ -363,16 +359,42 @@ static void pack_af_sample( short left, short right, unsigned int * pri_ch, unsi
  */
 static void unpack_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata )
 {
+    int command, data, exp, i, q;
+
 
         // iデータとqデータを抽出する。両者とも16bitで、bit14からbit29に格納されている
-    *idata = ( pri_ch << 2 ) & 0xFFFF0000;
-    *qdata = ( sec_ch << 2 ) & 0xFFFF0000;
+    i = ( pri_ch << 2 ) & 0xFFFF0000;
+    q = ( sec_ch << 2 ) & 0xFFFF0000;
+
+        // ブロック浮動小数点処理。expでスケーリングする。
+    exp = ( pri_ch >> 10 ) & 0x0F;
+    *idata = i >> exp;
+    *qdata = q >> exp;
 
+#ifdef DEBUG_BLOCK_FLOAT
+    {
+        static int tested = 0;
+        if ( (i & 0x80000000) && ! tested )
+        {
+            tested = 1;
+            syslog( LOG_NOTICE, "i: %8x, exp: %d, idata:%8x", i, exp, *idata);
+        }
+    }
+#endif
         // パラメータ・データを配列に格納する。
-        // 配列インデックスは comaddr、データはcomdataから。comdataはpri/secに分散している。
-    radio.comdata[ ( pri_ch >> 6 ) & 0x0F ] =
-            (( pri_ch << 6 ) & 0xF000) |      //
+        // 配列インデックスは comaddr、データはcomdataから。
+        // comdataはpri/secに分散している。
+
+    command = ( pri_ch >> 6 ) & 0x0F;
+    data =
+            (( pri_ch << 10 ) & 0xF000) |      //
             (( sec_ch >> 2 ) & 0x0FFF);
+        // パラメータ・データをrx_parameter.data配列に格納する。
+        // 配列インデックスは comaddr、データはcomdataから。
+
+    set_command_data( command, data);
+
+    radio.comdata[ command ] = data;
 }
 
 /**
@@ -381,32 +403,75 @@ static void unpack_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idat
  * \param sec_ch セカンダリ・チャンネルからのデータ
  * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
  * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
- * \param valid_iq IQデータが有効の時真、向こうの時は偽
+ * \param valid_iq IQデータが有効の時真、無効の時は偽
  * \detail
  */
 
 static void unpack_non_wide_fm(  unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq )
 {
+    static unsigned int debug_count = 0;
+    static unsigned int debug_izero = 0;
+    static unsigned int debug_qzero = 0;
+
         // インデックス分け
     if ( sec_ch & 0x02 )    // bit1が1ならindex = 1
     {
             // IQデータはbit[29:2]に格納されている
-        *idata = (pri_ch << 2);                 // プライマリ・チャンネルの場合はマスク不要
+        *idata = (pri_ch << 2) & 0xFFFFFFF0;
         *qdata = (sec_ch << 2) & 0xFFFFFFF0;
             // IQデータが有効であると通知する
         *valid_iq = TRUE;
+        if ( debug_count < 1000 )
+        {
+            debug_count++;
+            if ( *idata & 1 << 31 )
+                debug_izero++;
+            if ( *qdata & 1 << 31 )
+                debug_qzero++;
+        }
+        else
+        {
+            syslog(LOG_NOTICE, "number of sign bit =   %d, %d", debug_izero, debug_qzero);
+            debug_count = 0;
+            debug_izero = 0;
+            debug_qzero = 0;
+        }
     }
     else                    // index = 0
     {
+            // ラジオパラメータ
+        int command, data;
+
+        command = ( pri_ch >> 6 ) & 0x0F;
+        data = ( sec_ch >> 2 ) & 0xFFFF;
             // パラメータ・データをrx_parameter.data配列に格納する。
             // 配列インデックスは comaddr、データはcomdataから。
-        radio.comdata[ ( pri_ch >> 6 ) & 0x0F ] =
-                ( sec_ch >> 2 ) & 0xFFFF;
+
+        set_command_data( command, data);
+
             // IQデータが無効であると通知する
         *valid_iq = FALSE;
     }
 }
 
+/**
+ * \brief SHからのコマンドとパラメタを保存する
+ * \param command コマンド種別
+ * \param data コマンドパラメータ
+ * \details このルーチンはSHからFPGA経由で受け取ったコマンドとそのデータを内部変数に格納する。
+ * 格納されたデータはユーザーが実装した復調アルゴリズムから、API経由で利用される。
+ */
+static void set_command_data( unsigned int command, unsigned int data )
+{
+#ifdef DEBUG_COMMAND
+       if ( radio.comdata[command] != data ){
+           syslog(LOG_NOTICE, "Command : %d, Data : %d", command, data );
+       }
+#endif
+        radio.comdata[ command ] = data;
+
+}
+
 
 /**
  * \brief SPORT0 受信割り込みハンドラ
@@ -678,5 +743,25 @@ void monitor_task(VP_INT exinf)
         }
 #endif // DEBUG_QUEUEDEPTH
 
+#ifdef DEBUG_COMMAND_API
+        syslog( LOG_NOTICE, "radio_api_getARM_mode() %d",  radio_api_getARM_mode() );
+        syslog( LOG_NOTICE, "radio_api_getAIS_if_shift() %d",  radio_api_getAIS_if_shift() );
+        syslog( LOG_NOTICE, "radio_api_getAAT_attack() %d",  radio_api_getAAT_attack() );
+        syslog( LOG_NOTICE, "radio_api_getAFA_fade() %d",  radio_api_getAFA_fade() );
+        syslog( LOG_NOTICE, "radio_api_getAST_noise_squelch_level() %d",  radio_api_getAST_noise_squelch_level() );
+        syslog( LOG_NOTICE, "radio_api_getACP_cw_pitch() %d",  radio_api_getACP_cw_pitch() );
+        syslog( LOG_NOTICE, "radio_api_getADN_denoiser() %d",  radio_api_getADN_denoiser() );
+        syslog( LOG_NOTICE, "radio_api_getAAN_auto_notch() %d",  radio_api_getAAN_auto_notch() );
+        syslog( LOG_NOTICE, "radio_api_getAGL_gain_level() %d",  radio_api_getAGL_gain_level() );
+        syslog( LOG_NOTICE, "radio_api_getAIF_filter() %d",  radio_api_getAIF_filter() );
+        syslog( LOG_NOTICE, "radio_api_getABN_noise_blanker_on() %d",  radio_api_getABN_noise_blanker_on());
+        syslog( LOG_NOTICE, "radio_api_getARG_agc_on() %d",  radio_api_getARG_agc_on());
+        syslog( LOG_NOTICE, "radio_api_getANE_noise_squelch_on() %d",  radio_api_getANE_noise_squelch_on());
+        syslog( LOG_NOTICE, "radio_api_getAAF_hpf() %d",  radio_api_getAAF_hpf() );
+        syslog( LOG_NOTICE, "radio_api_getAAF_lpf() %d",  radio_api_getAAF_lpf() );
+        syslog( LOG_NOTICE, "radio_api_getAVP_voice_squelch_level() %d",  radio_api_getAVP_voice_squelch_level() );
+        syslog( LOG_NOTICE, "radio_api_getAVS_voice_squelch_on() %d",  radio_api_getAVS_voice_squelch_on() );
+#endif // DEBUG_COMMAND_API
+
     }
 }