/*****************************************************************************
 * Module    : Task
 * File      : task_record.h
 * Author    : Hanny
 * Function  : 录音任务用到的结构体等
 *****************************************************************************/
#ifndef TASK_RECORD_H
#define TASK_RECORD_H

#define DIR_Attr            11
#define REC_SYNC_CNT        5      //每10秒同步一次

#define BLOCK_SIZE          128L    //BLK的大小

#if (REC_TYPE == REC_WAV_ADPCM)
#define RECORD_SAMPLES      0xF9
#else
#define RECORD_SAMPLES      0x80
#endif
enum{
    REC_STA_PAUSE,
    REC_STA_STOP,
    REC_STA_STOPPING,
    REC_STA_RECORD,
};

#define	max(a,b)            (((a)>(b))?(a):(b))

typedef struct {
    u8  rec_sta;                    //录音状态
    u8  dir_open;                   //文件夹已创建标志
    u8  file_open;                  //文件打开标志
    u8  sync_cnt;                   //同步控制
    u16 disp_file_num;              //显示保存第几首
    u32 rec_time;                   //现在显示的录音时间
    u8  sname_ptr;
#if (RECORD_FILE_NAME == LONG_NAME)
    u8  lname_ptr;
#endif
    u8  pos;                        //录音buf标志
    u8  volatile block_cnt;         //录音的BLK数
    u32 file_size;                  //录音文件大小
    u32 file_ssect;                 //录音文件第一个扇区
    u8 *block_adr;                  //录音buf的当前地址
    u8  block_lmt;                  //录音buf的BLK数
    u8  slice;                      //每个BLK的SLC数
    u8  spl;                        //每个BLK的样点数
    u8  chs;                        //录音的声道数
    u16 spr;                        //录音的采样率
    u8 play_flag;                   //是否播放刚录下的文件

#if IS_LCD_DISPLAY
    u8 updata_flag;                 //更新标志
    u8 disp_sta;                    //播放闪烁状态
#endif
} type_task_rec;

extern type_task_rec t_rec;
extern FATFS fat_fs;
extern FIL fat_file,fat_file_opt;
extern FATFS_HOOK fs_hook;

extern IAR_XDATA_A u16 adpcm_input;
extern IAR_XDATA_A u16 adpcm_output;
extern IAR_DATA_A  u8  adpcm_channel;
extern IAR_IDATA_A u8  adpcm_index[2];

__near_func void adpcm_encode(u16 blocks, u8 part);
__near_func u32 clust2sect(u32 clust);
__near_func u32 search_free_clust(void);
__near_func bool move_window(u32 sector);
__near_func void mkitem_exfat(u8 *dir, char *fn, u8 fattrib, u32 dclust, u32 fsize);
__near_func void mkitem_fat(u8 *dir, char *fn, u8 fattrib, u32 dclust, u32 fsize);
__near_func u8 f_open_exist(FIL* hFile);
__near_func void adpcm_encode(u16 blocks, u8 part);

bool wav_load_code(u16 addr);
void task_record_display(void);
void task_recording_display(void);
void task_record_stop(void);

#endif
