⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdc.c

📁 一款车载DVD的车机源程序(正在生成中的哦)
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************
Project  :  Car two ting dvd System
Compiler :  ST7 HiCross C (HiWARE)
Module   :  autos.c 
Version  :  V 1.0
Created  :  24 11, 2005
Author   :  tomi / SA
Description
         -  CD Changer Control Procedure of the car two ting dvd System.  
Modified
		 - tomi
***************************************************************************/
#include "CDC.h"
#include "Inter.h"
#include "Libr.h"
#include "St72321.h"
#include "IOport.h"
#include "Sys_config.h"
#include "System_operation.h"


/**************************************************************************
        Definition of Constants & Public Variables
***************************************************************************/

#define DSCMAX    10

unsigned char CdcCode=1;	//Force it is the Sanyo  10 Disc Model
unsigned char CdcCmd;
unsigned char CdcFlag;
unsigned char CdcFlag1;
unsigned char CdcStatus;
unsigned char CdcStatus1;
unsigned char CdcErr;
unsigned char CurDisc;
unsigned int CdcDiscs;
unsigned char CdcTrack;
unsigned char CdcState;
unsigned char CdcMin;
unsigned char CdcSec;
unsigned char DiscNo;
unsigned char TxCntr;
static unsigned char iCdc;	//From this register then you can find out how many bits data send to the changer
static unsigned char jCdc;
static unsigned char Err4Cnt;

static unsigned char StaMusic;
static unsigned char EndMusic;


unsigned char Opt2Flag;
unsigned char Fpn_State;
unsigned char KeyFlag1;
unsigned char CurMode;
unsigned char PwrFlag;

static void CdcPlay (void);
static void CdcNoMgz (void);
static void CdcError (void);
static void CdcNoDsk (void);
static void CdcNoCnt (void);

static void Cdc1Idle (void);
static void Cdc1Try (void);
static void Cdc1Try1 (void);
static void Cdc1Stop (void);


static char Cdc_MegazControl;


void PIN_CdcOut(void);
void PIN_CdcIn(void);


        
//#define CDC_MEGAZ_VALUE    0    
//#define CDC_MEGAZ_CTRL     1
//#define CDC_NODSC_VALUE    2    
//#define CDC_NODSC_CTRL     3
//#define CDC_MEGAZ_CURVAL   ValBit(CrxBuffer[0],CDC_MEGAZ_VALUE)  
//#define CDC_MEGAZ_PREVAL   ValBit(Cdc_MegazControl,CDC_MEGAZ_VALUE)
//#define CDC_NODSC_CURVAL   GetCdcStat1(NoDsk1)
//#define CDC_NODSC_PREVAL   ValBit(Cdc_MegazControl,CDC_NODSC_VALUE)     
/*--------------------------------------------------------------------------
Routine : CdcPlay
Input   : 
Output  : 
Description 
        - 'Play after Stop' Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void CdcPlay (void)
{
	if (GetCdcFlg(ReqCtx))
  		{
     		//AUD_FastMuteOff();
     		CdcState = CD_IDLE;
     		return;
  		}
  	if (CdcDelay != 0)  return;
  	if (GetCdcStat1(DscChn)) return; 
  
  	CdcState = CD_IDLE;
  	if (GetCdcStat(fplay))
  		{  
    		if (BitVal(PinAUD_TelDet))
         	//AUD_FastMuteOff();
     		return;
  		}
	if (GetCdcStat1(NoMgzn) || GetCdcStat1(NoDsk) || (CdcErr != 0))
  		{
     		if (BitVal(PinAUD_TelDet))  //AUD_FastMuteOff();
     		return;
  		}
     	CdcCmd = C_PLAY;
     	SetCdcFlg(ReqCtx);
}

/*--------------------------------------------------------------------------
Routine : CdcNoMgz
Input   : 
Output  : 
Description 
        - No Magazine Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void CdcNoMgz (void)
{
  	if (CurMode != CDCMOD)
  		{                                     /* Mode Changed ? */ 
     		CdcState = CD_IDLE;
     		return;
  		}
  	if (!GetCdcStat1(NoMgzn))
  		{                                       /* Magazine Inserted ? */
     		ClrCdcStat(fplay);                 /* Clear The Remaining Flag */
     		CdcCmd = C_PLAY;                   
     		SetCdcFlg(ReqCtx);
     		CdcState = CD_IDLE;
     		return;
  		}  
  	if (CdcDelay != 0)  return;
}

/*--------------------------------------------------------------------------
Routine : CdcError
Input   : 
Output  : 
Description 
        - Error Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void CdcError (void)
{
  	if (CurMode != CDCMOD)
  		{                                     /* Mode Changed ? */ 
     		CdcState = CD_IDLE;
     		return;
  		}
  	if (GetCdcStat1(NoMgzn))
  		{
     		CdcDelay = 500;
     		CdcState = CD_NOMGZ;         
     		return;
  		}  
  	if (CdcDelay != 0)  return;

  	if (!GetCdcFlg1(Cdc1))
  		{ 
     		if ((CdcErr == 4) && (Err4Cnt < (DiscNo-1)))
     			{
        		Err4Cnt++;
        		SetCdcStat1(Err4);     
        		CdcCmd = C_DISCUP;
        		SetCdcFlg(ReqCtx);     
        		CdcState = CD_IDLE;
        		return;
     			}
  		}  
  	Err4Cnt = 0;   
}

/*--------------------------------------------------------------------------
Routine : CdcNoDsk
Input   : 
Output  : 
Description 
        - No Disk Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void CdcNoDsk (void)
{
	if (CurMode != CDCMOD)
  		{                                     /* Mode Changed ? */ 
     		CdcState = CD_IDLE;
     		return;
  		}
  	if (GetCdcStat1(NoMgzn))
  		{
     		CdcDelay = 500;
     		CdcState = CD_NOMGZ;         
     		return;
  		}  
  	if (CdcDelay != 0)  return;
}

/*--------------------------------------------------------------------------
Routine : CdcNoCnt
Input   : 
Output  : 
Description 
        - No Connection Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void CdcNoCnt (void)
{
  	if ((CurMode != CDCMOD) || !GetCdcFlg(NoCdc))
  		{                                     /* Mode Changed ? */ 
     		CdcState = CD_IDLE;
     		return;
  		}
  	if (CdcDelay != 0)  return;
}
/*--------------------------------------------------------------------------
Routine : WriteCdc1
Input   : 
Output  :         
Description 
        - Write to SANYO CD Changer Control Procedure
--------------------------------------------------------------------------*/ 
void WriteCdc1 (void)
{
  switch (CdcState)
  {
     case CD_IDLE:   Cdc1Idle();
        break;
     case CD_PLAY:   CdcPlay();
        break;
     case CD_TRY:    Cdc1Try();
        break;
     case CD_TRY1:   Cdc1Try1();
        break;
     case CD_STOP:   Cdc1Stop();
        break;
     case CD_NOMGZ:  CdcNoMgz();
        break;
     case CD_ERROR:  CdcError();
        break;        
     case CD_NODSK:  CdcNoDsk();
        break;
     case CD_NOCNT:  CdcNoCnt();
        break;        
     default:        CdcState = CD_IDLE;
        break;
  }
}

/*--------------------------------------------------------------------------
Routine : Cdc1Idle
Input   : 
Output  : 
Description 
        - Idle State Handling Routine of CD Changer
--------------------------------------------------------------------------*/ 
static void Cdc1Idle (void)
{
	if (!GetCdcFlg(ReqCtx))
  		{
     		/* Send Connection Check Command Every 2 Sec if there was no recei data*/
     		if (Cd1Delay == 0)           /* during pause and disc change no */
     			{
        		CdcCmd = C_CHECK; 
        		SetCdcFlg(ReqCtx);
        		Cd1Delay = 70;    /*70=1sec*/
     			}        
     		if (System_mode == CDC_mode)
     			{    
        		if (GetCdcStat(fplay)) 
        			asm	nop;//AUD_FastMuteOff(); //mute control only donghae project
        		if (GetCdcStat1(NoMgzn))
        			{
           			CdcDelay = 500;
           			CdcState = CD_NOMGZ;
           			return;
        			}
        		if((CdcErr != 0))
        			{
           			CdcDelay = 1000;
           			CdcState = CD_ERROR;
           			return;
        			}
       		if(GetCdcStat1(NoDsk))
        			{
           			CdcDelay = 500;
           			CdcState = CD_NODSK;         
        			}
       	 	if(GetCdcFlg(NoCdc))
        			{
           			CdcDelay = 500;
           			CdcState = CD_NOCNT;
        			} 
     			}
    		return;            
  	}

  	if (GetCdcFlg(RdyCtx))  return;
  	if (Cd1Tout != 0)  return;
  	if (GetCdcStat1(NoMgzn))
  		{
     		if ((CdcCmd != C_STOP) && (CdcCmd != C_PLAY))
     			{
        		ClrCdcFlg(ReqCtx);
        		return;
     			}
  		}
  	if (GetCdcFlg(CdcRx))  return;	//In receive mode then return
  	SetCdcFlg(CdcTx);	//Chang to send data mode
  	ClrCdcFlg(ReqCtx);
  	CtxBuffer[0] = (CdcCode << 4) + 0x01; /* Write Command */
  	CtxBuffer[2] = 0;
  	CtxBuffer[3] = 0;
  	switch (CdcCmd)
  		{
     		case C_CHECK:     
        		CtxBuffer[0] = (CdcCode << 4) + 0x08;
        		SetCdcFlg1(ConChk);
        		TxCntr = 10;                    /* try 10 times */
        		CdcDelay = 2;                   /* Some Delay */
        		CdcState = CD_TRY; 
        		break;
     		case C_BACKUP:
        		CtxBuffer[0] = (CdcCode << 4) + 0x09;
        		SetCdcFlg1(BckUp);
        		TxCntr = 1;                    /* try 10 times */
        		CdcDelay = 2;                   /* Some Delay */
        		CdcState = CD_TRY1; 
        		break;
     		case C_STOP:     
        		CtxBuffer[1] = 0x12;            /* stop request */
        		CdcDelay = 50;                  /* Some Delay */        
        		CdcState = CD_STOP;
        		break;
     		case C_REPLAY:      
        		CtxBuffer[1] = 0x10;
        		CtxBuffer[2] = 0x10;            /* play request */ 
        		break;
     		case C_SEAROFF:
        		CtxBuffer[1] = 0x10;
        		CtxBuffer[2] = 0x10;            /* play request */
        		break;
     		case C_PLAY:
        		if (GetCdcFlg(CdcStop))
        			{
           			CurDisc = 0;                 /* for '--' display */
           			ClrCdcFlg(CdcStop);
        			}
        		CtxBuffer[1] = 0x10;
        		CtxBuffer[2] = 0x10;            /* play request */
        		CdcDelay = 50;                  /* Some Delay */
        		CdcState = CD_PLAY;
        		break;
     		case C_PAUSE:
        		CtxBuffer[1] = 0x10;     
        		CtxBuffer[2] = 0x20;            /* pause request */
        		SetCdcFlg1(DspLtr);           /* Display Later */                    
        		break;
     		case C_TRACKUP:
        		CtxBuffer[1] = 0x30;            /* current disc */
        		CtxBuffer[2] = 0xA3;        /* Music 1 Up */
        		if (GetCdcStat(fdrdm))
        			{
           			CtxBuffer[1] = 0x3B;        /* Disc 1 Up */  
        			}
        		CtxBuffer[3] = 0x10;            /* & play */
        		SetCdcFlg1(SusTm);
        		break;
     		case C_TRACKDN:
        		CtxBuffer[1] = 0x30;            /* current disc */
           		CtxBuffer[2] = 0xB3;        /* Music 1 Down */
        		if (GetCdcStat(fdrdm))
        			{
           			CtxBuffer[1] = 0x3F;        /* Disc 1 Down */
        			}
        		CtxBuffer[3] = 0x10;            /* & play */
        		SetCdcFlg1(SusTm);
        		break;
     		case C_SEARUP:
        		CtxBuffer[1] = 0x10;
        		CtxBuffer[2] = 0x40;            /* FWD request */
        		break;
     		case C_SEARDN:
        		CtxBuffer[1] = 0x10;
        		CtxBuffer[2] = 0x80;            /* BWD request */
        		break;
     		case C_DISCUP:
        		for (iCdc = 0; iCdc < DSCMAX; iCdc++)
        			{
           			CurDisc++;
           			if (CurDisc == DSCMAX + 1)  CurDisc = 1;
           			if (ValBit(CdcDiscs, CurDisc-1))
           				{
              			CtxBuffer[1] = 0x30 + CurDisc;
              			CtxBuffer[2] = 0x01;      /* Music 1 */
              			CtxBuffer[3] = 0x10;         /* & play */
					break;
           				}
        			}
        		break;
     		case C_DISCDN:
        		for (iCdc = 0; iCdc < DSCMAX; iCdc++)
        			{
           			CurDisc--;
           			if (CurDisc == 0)  CurDisc = DSCMAX;
           			if (ValBit(CdcDiscs, CurDisc-1))
           				{
              			CtxBuffer[1] = 0x30 + CurDisc;
              			CtxBuffer[2] = 0x01;      /* Music 1 */
              			CtxBuffer[3] = 0x10;         /* & play */
					break;
           				}
        			}
        		break;
     		case C_REPEAT:
        		CtxBuffer[1] = 0x44;            /* repeat */
        		break;
     		case C_DSCREP:
        		CtxBuffer[1] = 0x48;            /* disc repeat */
        		break;
     		case C_REPOFF:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -