📄 cdc.c
字号:
/***************************************************************************
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 + -