/******************************************************************************
**
** RASP-MX UART拡張の共通ヘッダ
**
** 2017.05.31 K.Takagi エラーコード移行
** 2017.05.15 K.Takagi 各種定義
**
**
*/


#ifndef _INCLUDE_MX_UART_H_
#define _INCLUDE_MX_UART_H_

#define MX_UART_DUMMY_NAME          "/tmp/mx-uart"

#define ERR_MX_UART         -1
#define ERR_MX_UART_TIMEOUT -2
#define ERR_MX_UART_HEADER  -3
#define ERR_MX_UART_CSUM    -4


#define FLAG_to_TIME(flag)          ((flag >> 26) & 0x0001)
#define FLAG_to_ADVANCE(flag)       ((flag >> 16) & 0x03ff)
#define FLAG_to_SRC_NUM(flag)       ((flag >> 12) & 0x000f)
#define FLAG_to_MUSIC_NUM(flag)     ((flag >>  0) & 0x0fff)

#define CONV_to_FLAG(time_en, advance, src_num, music_num)  ( ((time_en   & 0x0001) << 26) | \
                                                              ((advance   & 0x03ff) << 16) | \
                                                              ((src_num   & 0x000f) << 12) | \
                                                              ((music_num & 0x0fff) <<  0) )


#define MX_UART_MAX_SRC_NUM         16      /*  4bit */
#define MX_UART_MAX_MUSIC_NUM       4096    /* 12bit */
#define MX_UART_MAX_ADVANCE_NUM     1024    /* 10bit */

#define MX_UART_MUSIC_GAIN          512

#ifdef __cplusplus
extern "C" {
#endif


#ifndef uint8
#define uint8 unsigned char
#endif

#ifndef uint16
#define uint16 unsigned short
#endif

#ifndef uint32
#define uint32 unsigned int
#endif

typedef struct _mx_uart_src_t_
{
    int   src_id;
    short dir_id;
    short power;
} mx_uart_src_t;


/*
** header
**   UART上のバイナリデータの先頭を識別するための固定コード
**   ユーザアプリ上では不要
** 
** data_flag
**   UART上のバイナリデータに含まれる情報を示すコード
**   ユーザアプリ上では不要
**   bit[31]        常に0
**   bit[30..27]    予備
**   bit[26]        MX側の時刻情報が含まれているかのフラグ
**   bit[25..16]    分離音データの要素数（advance）
**   bit[15..12]    検出音源数（src_num）
**   bit[11..0]     MUSICスペクトルの要素数（music_num）
** 
** frame_count
**   MX上のフレーム番号
**
** mx_sec
** mx_usec
**   MX上の時刻情報
**   UART上のバイナリデータに含まれない場合あり
**
** music_num
**   MUSICスペクトルの要素数（最大4095個）
**   UART上のバイナリデータではdata_flagに含まれる
**
** music
**   MUSICスペクトル
**
** src_num
**   検出された音源数（最大15個）
**   UART上のバイナリデータではdata_flagに含まれる
**
** src_info
**   検出された音源情報
**
** advance
**   分離音データの要素数（最大1023個）
**   UART上のバイナリデータではdata_flagに含まれる
**
** wav
**   分離音データ
**   本システムは最大でも1ch分しか転送しない
**
** csum
**   UART上のバイナリデータのチェックサム
**
*/

typedef struct _mx_uart_t_
{
    int header;             
    int data_flag;      
    int frame_count;
    
    uint32 mx_sec;
    uint32 mx_usec;
    
    short music_num;
    short music[MX_UART_MAX_MUSIC_NUM];
    
    short src_num;
    mx_uart_src_t src_info[MX_UART_MAX_SRC_NUM];
    
    short advance;
    short wav[MX_UART_MAX_ADVANCE_NUM];
    
    uint8 csum;
    
} mx_uart_t;


#ifdef __cplusplus
}
#endif

#endif /* _INCLUDE_MX_UART_H_ */

/* EOF */

