#include "Sound_List.h"
#include "Sound_Player.h"
#include "Sound_Scheduler.h"

#define SND_PLAYER_IDLE     0x00u
#define SND_PLAYER_PLAY_REQ 0x01u
#define SND_PLAYER_PLAYING  0x02u
#define SND_PLAYER_STOP_REQ 0x03u

/******************************************************************************
声音属性列表
******************************************************************************/
const SoundAttributeStruct SoundList [ SND_TOTAL_NUM ] = {
    /*=====================================================================================
                 声音名称                 |              音源              |        模式
    -------------------------------------------------------------------------------------*/
    {/*tick                                */  SND_SRC_TICK,                     SND_TYPE_NORMAL,  },
    {/*tock                                */  SND_SRC_TOCK,                     SND_TYPE_NORMAL,  },
    {/*雷达长鸣                              */SND_SRC_Radar_Changming,          SND_TYPE_RADAR,  },
    {/*雷达 1HZ                            */  SND_SRC_Radar_1HZ,                SND_TYPE_RADAR,  },
    {/*雷达 2HZ                            */  SND_SRC_Radar_2HZ,                SND_TYPE_RADAR,  },
    {/*雷达 4HZ                            */  SND_SRC_Radar_4HZ,                SND_TYPE_RADAR,  },
    {/*雷达 2S                             */  SND_SRC_Radar_2S,                 SND_TYPE_RADAR,  },
    {/*雷达 4S                             */  SND_SRC_Radar_4S,                 SND_TYPE_RADAR,  },
    {/*雷达 0.5S                           */  SND_SRC_Radar_0S,                 SND_TYPE_RADAR,  },
    {/*雷达 0.5S                           */  SND_SRC_Radar_OK0S,               SND_TYPE_RADAR,  },
    {/*制动液位低                          */  SND_SRC_EPB_Status,               SND_TYPE_NORMAL,  },
    {/*安全带未系                          */  SND_SRC_SEATBELT_DR_1HZ,          SND_TYPE_NORMAL,  },
    {/*安全带未系                          */  SND_SRC_SEATBELT_DR_2HZ,          SND_TYPE_NORMAL,  },
    {/*车门开报警                          */  SND_SRC_DoorOpen,                 SND_TYPE_NORMAL,  },
    {/*车门开报警 1HZ                      */  SND_SRC_DoorOpen_1HZ,             SND_TYPE_NORMAL,  },
    {/*EBD故障                             */  SND_SRC_EBD_fault,                SND_TYPE_NORMAL,  },
    {/*ABS故障                             */  SND_SRC_ABS,                      SND_TYPE_NORMAL,  },
    {/*EPS故障                             */  SND_SRC_EPS,                      SND_TYPE_NORMAL,  },
    {/*驻车制动                             */  SND_SRC_Park_Brak,                    SND_TYPE_NORMAL,  },
    {/*电机故障                            */  SND_SRC_MotorFault,               SND_TYPE_NORMAL,  },
    {/*动力电池报警                        */  SND_SRC_SOC_Fault,                SND_TYPE_NORMAL,  },
    {/*高压绝缘故障                        */  SND_SRC_InsulationFault,          SND_TYPE_NORMAL,  },
    {/*电池热失控                          */  SND_SRC_SOC_HT,                   SND_TYPE_NORMAL,  },
    {/*单踏板功能激活                      */  SND_SRC_Energy_Recovery,          SND_TYPE_NORMAL,  },
    {/*单踏板功能激活1                     */  SND_SRC_Energy_Recovery_1,        SND_TYPE_NORMAL,  },
    {/*ECO状态激活                         */  SND_SRC_ECO,                      SND_TYPE_NORMAL,  },
    {/*READY状态激活                       */  SND_SRC_READY,                    SND_TYPE_NORMAL,  },
    {/*限功率报警                          */  SND_SRC_PowerLimit,               SND_TYPE_NORMAL,  },
    {/*蓄电池电量低                        */  SND_SRC_SOC_LP,                   SND_TYPE_NORMAL,  },
    {/*蓄电池充电故障                      */  SND_SRC_SOC_CF,                   SND_TYPE_NORMAL,  },
    {/*动力系统故障                        */  SND_SRC_SystemFault,              SND_TYPE_NORMAL,  },
    {/*动力系统故障                        */  SND_SRC_SystemFault1,              SND_TYPE_NORMAL,  },
    {/*换挡错误                            */  SND_SRC_GearFault,                SND_TYPE_NORMAL,  },
    {/*超载报警                            */  SND_SRC_WeightOverload,           SND_TYPE_NORMAL,  },
    {/*超载报警                            */  SND_SRC_WeightOverload2,           SND_TYPE_NORMAL,  },
    {/*远程锁车                            */  SND_SRC_RemoteLocking,            SND_TYPE_NORMAL,  },
    {/*小灯未关                            */  SND_SRC_PositionNotClosed,        SND_TYPE_NORMAL,  },
    {/*驾驶员离车提醒                      */  SND_SRC_DepartureReminder,        SND_TYPE_NORMAL,  },
    {/*OTA 报警0                           */  SND_SRC_OTA_0,                    SND_TYPE_NORMAL,  },
    {/*OTA 报警1                           */  SND_SRC_OTA_1,                    SND_TYPE_NORMAL,  },
    {/*OTA 报警2                           */  SND_SRC_OTA_2,                    SND_TYPE_NORMAL,  },
    {/*OTA 报警3                           */  SND_SRC_OTA_3,                    SND_TYPE_NORMAL,  },
    {/*OTA 报警4                           */  SND_SRC_OTA_4,                    SND_TYPE_NORMAL,  },
    {/*OTA 报警5                           */  SND_SRC_OTA_5,                    SND_TYPE_NORMAL,  },
    {/*EPS 报警5                           */  SND_SRC_ESC,                      SND_TYPE_NORMAL,  },
    {/*超速报警                             */  SND_SRC_Over_Speed,             SND_TYPE_NORMAL,  },

    /*====================================================================================*/
};

/******************************************************************************
音源属性表  组合音
******************************************************************************/
const SndAttributeStruct SndAttributeTable [ SND_SRC_TOTAL_NUM ] = {
    /*============================================================================================================================================
            音源名称                |           音源                | 优先级 |     循环次数               |   播放模式          | 周期(ms)
    ---------------------------------------------------------------------------------------------------------------------------------------------*/
    {        /*  tock              */         0x05,     1u,        1u,                        SND_MODE_SINGLE,        100,      },
    {        /*  tick              */         0x06,     2u,        1u,                        SND_MODE_SINGLE,        100,      },
    {        /*  雷达长鸣          */          0x02,     12u,        SND_CYCLE_NONSTOP,        SND_MODE_LOOP,          0u,    },
    {        /*  雷达 1HZ          */         0x03,     12u,        SND_CYCLE_NONSTOP,        SND_MODE_SINGLE,          1000u,    },
    {        /*  雷达 2HZ          */         0x03,     12u,        SND_CYCLE_NONSTOP,        SND_MODE_SINGLE,          500u,    },
    {        /*  雷达 4HZ          */         0x04,     12u,        SND_CYCLE_NONSTOP,        SND_MODE_SINGLE,          250u,    },
    {        /*  雷达 2S           */         0x02,     12u,        1u,                        SND_MODE_LOOP,        2000u,    },
    {        /*  雷达 4S           */         0x02,     3u,        1u,                        SND_MODE_SINGLE,        4000u,    },
    {        /*  雷达 0.5S         */         0x02,     3u,        1u,                        SND_MODE_SINGLE,        500u,    },
    {        /*  雷达 0.5S         */         0x02,     12u,        1u,                        SND_MODE_SINGLE,        500u,    },
    {        /*  制动液位低        */          0x07,     2u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  安全带未系 1HZ    */          0x03,     3u,        SND_CYCLE_NONSTOP,         SND_MODE_SINGLE,        1000u,    },
    {        /*  安全带未系 2HZ    */          0x03,     3u,        SND_CYCLE_NONSTOP,         SND_MODE_SINGLE,        500u,    },
    {        /*  车门开报警        */          0x07,     4u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  车门开报警 1HZ    */          0x07,     4u,        SND_CYCLE_NONSTOP,         SND_MODE_SINGLE,        1000u,    },
    {        /*  EBD故障           */         0x07,     6u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  ABS故障           */         0x07,     7u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  EPS故障           */         0x07,     8u,        1u,                        SND_MODE_SINGLE,        1000u,    },
     {        /*  驻车制动           */         0x07,     5u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  电机故障          */          0x07,     9u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  动力电池报警      */          0x07,     10u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  高压绝缘故障      */          0x07,     11u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  电池热失控        */          13,     1u,       SND_CYCLE_NONSTOP,         SND_MODE_SINGLE,        500u,    },
    {        /*  单踏板功能激活    */           0x07,     13u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  单踏板功能激活 1  */           0x07,     13u,       3u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  ECO状态激活       */          0x07,     14u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  READY状态激活     */          0x07,     15u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  限功率报警        */          0x07,     16u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  蓄电池电量低      */          0x07,     17u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  蓄电池充电故障    */           0x07,     17u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  动力系统故障      */           0x07,     18u,       10u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  动力系统故障      */           0x07,     18u,       SND_CYCLE_NONSTOP,          SND_MODE_SINGLE,        1000u,    },

    {        /*  换挡错误          */          0x07,     20u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  超载报警          */          0x07,     20u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  超载报警2         */          0x07,     20u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  远程锁车          */          0x07,     21u,       1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  小灯未关          */          0x07,     22u,       10u,                       SND_MODE_SINGLE,        1000u,    },
    {        /*  驾驶员离车提醒    */             13,     23u,       3u,                        SND_MODE_SINGLE,        500u,    },
    {        /*  OTA 报警0         */          0x07,     4u,        SND_CYCLE_NONSTOP,         SND_MODE_SINGLE,        1000u,    },
    {        /*  OTA 报警1         */          0x07,     4u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  OTA 报警2         */          0x07,     4u,        3u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  OTA 报警3         */          0x07,     4u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  OTA 报警4         */          0x07,     4u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  OTA 报警5         */          0x07,     4u,        240u,                      SND_MODE_SINGLE,        250u,    },
    {        /*  ESC 报警4         */          0x07,     4u,        1u,                        SND_MODE_SINGLE,        1000u,    },
    {        /*  超速报警 1HZ      */          0x07,     13u,        4,                        SND_MODE_SINGLE,        1000u,    },
    /*===========================================================================================================================================*/
};

/******************************************************************************
伪音源名称列表
******************************************************************************/
#define   SND_SRC_NONE                      0xFFu    /*没有声音*/
#define   SND_SRC_CURRENT                   0xFEu    /*当前播放的声音*/

/******************************************************************************
音源循环次数
******************************************************************************/
#define   SND_CYCLE_NONSTOP                 0xFFu    /*不停播放*/

/******************************************************************************
音源播放模式
******************************************************************************/
#define   SND_MODE_SINGLE                   0x00u    /*使用ISD_Play_Vp方法播放*/
#define   SND_MODE_LOOP                     0x01u    /*使用ISD_Play_Vp_Loop方法播放*/


uint8_t   SoundEnableCode[SND_TOTAL_NUM];
SoundSchedulingStruct       SoundScheduling;


void Sound_Scheduler_Init(void)
{
    uint8_t i;

    for (i = 0u; i < SND_TOTAL_NUM; i++)
    {
        SoundEnableCode[i] = 0u;
    }

    Sound_Clear();
    SoundScheduling.Current = SND_NONE;
    SoundScheduling.Next    = SND_NONE;
    SoundScheduling.ReqCode = 0u;
    SoundScheduling.StopReq = 0u;
}

/*****************************************************************************
ReqCode:请求码,0 - 表示无效请求,不请求播放声音
                非0值 - 请求播放声音,该请求码将被记录,对于只播放一次的声音,
                如果与上一次请求播放该声音的请求码相同声音就不会再被重复播放
*****************************************************************************/
void Sound_Request(uint8_t Sound, uint8_t ReqCode)
{
    uint8_t PriorityRef;
    uint8_t PriorityNew;

    if ((Sound < SND_TOTAL_NUM) && (ReqCode))
    {
        if ((SoundEnableCode[Sound] != ReqCode) || (SoundList[Sound].Type != SND_TYPE_NORMAL))
        {

            if (SoundScheduling.Next < SND_TOTAL_NUM)             /*如果已有即将要播放的声音*/
            {
                if (Sound != SoundScheduling.Next)
                {
                    PriorityRef = Sound_Priority_Query(SoundList[SoundScheduling.Next].Src);
                    PriorityNew = Sound_Priority_Query(SoundList[Sound].Src);

                    if (PriorityNew < PriorityRef)
                    {
                        SoundScheduling.Next = Sound;             /*请求的声音具有更高的优先级*/
                        SoundScheduling.ReqCode = ReqCode;
                    }
                    else if (PriorityNew == PriorityRef)
                    {
                        if (SoundList[Sound].Type == SND_TYPE_RADAR)
                        {
                            SoundScheduling.Next = Sound;         /*同优先级雷达声可相互打断*/
                            SoundScheduling.ReqCode = ReqCode;
                        }
                    }
                    else
                    {}
                }
            }
            else                                                  /*如果没有即将要播放的声音*/
            {
                if (Sound != SoundScheduling.Current)
                {
                    PriorityRef = Sound_Priority_Query(SND_SRC_CURRENT);
                    PriorityNew = Sound_Priority_Query(SoundList[Sound].Src);

                    if (PriorityNew < PriorityRef)
                    {
                        SoundScheduling.Next = Sound;             /*请求的声音具有更高的优先级*/
                        SoundScheduling.ReqCode = ReqCode;
                        if(SoundScheduling.Current<SND_TOTAL_NUM) 
                        {
                          if(SoundEnableCode[SoundScheduling.Current]>0u)
                          {
                            SoundEnableCode[SoundScheduling.Current]=0U;/*lmj:20200821不加报警被打断后无法重播,只需要不同不需要准数*/
                          }
                        }
                    }
                    else if (PriorityNew == PriorityRef)
                    {
                        if (SoundList[Sound].Type == SND_TYPE_RADAR)
                        {
                            SoundScheduling.Next = Sound;         /*同优先级雷达声可相互打断*/
                            SoundScheduling.ReqCode = ReqCode;
                        }
                    }
                    else
                    {}
                }
            }
        }
    }
}



void Sound_Delete(uint8_t Sound)
{
    if (Sound < SND_TOTAL_NUM)
    {
        if (SoundEnableCode[Sound])                      /*是已播放过的声音*/
        {
            if (Sound == SoundScheduling.Current)
            {
                SoundScheduling.StopReq = 1u;
            }
            else
            {
                if (Sound == SoundScheduling.Next)
                {
                    SoundScheduling.Next = SND_NONE;
                }

                SoundEnableCode[Sound] = 0u;
            }

        }
    }
}

/*50ms*/
void Sound_Scheduling_Service(void)
{
    /*处理声音停止请求*/
    if (SoundScheduling.StopReq)
    {
        if (SoundScheduling.Current < SND_TOTAL_NUM)
        {
            if (Sound_Stop(SoundList[SoundScheduling.Current].Src) == 0u)
            {
                SoundScheduling.StopReq = 0u;
                SoundEnableCode[SoundScheduling.Current] = 0u;
                SoundScheduling.Current = SND_NONE;
            }
        }
    }

    /*使用查询优先级方法查看当前声音是否还在播放*/
    if (SoundScheduling.Current < SND_TOTAL_NUM)
    {
        if (Sound_Priority_Query(SND_SRC_CURRENT) == 0xFFu)
        {
            SoundScheduling.Current = SND_NONE;
        }
    }

    /*播放请求的声音*/
    if (SoundScheduling.Next < SND_TOTAL_NUM)
    {
        if (SoundScheduling.Current < SND_TOTAL_NUM)   /*如果当前有声音正在播放,则停止播放该声音*/
        {
            Sound_Stop(SoundList[SoundScheduling.Current].Src);
        }

        if (Sound_Play(SoundList[SoundScheduling.Next].Src) == 0u)            /*如果请求的声音播放成功*/
        {
            SoundEnableCode[SoundScheduling.Next] = SoundScheduling.ReqCode;  /*声音已播放*/
            SoundScheduling.Current = SoundScheduling.Next;
            SoundScheduling.Next    = SND_NONE;
        }
    }

}

uint8_t Get_SoundScheduling_Current(void)
{
    return SoundScheduling.Current;
}