📄 main_bridge.c
字号:
#include "IO870.h"
#include "global.h"
#include "cust_io.h"
#include "keydef.h"
#include "Main_Bridge.h"
#include "Bridge_Changer.h"
extern void Send_Data_2_CDC(void);
extern BYTE CDC_Type;
extern S_Table_DATA_2_CDC Table_DATA_2_CDC[];
extern BYTE DATA_2_CDC[];
extern BYTE Total_Bit_2_CDC;
extern BYTE Current_DATA_2_MAIN_Index;
extern BYTE DATA_2_Main[];
extern BYTE CDC_Disc_NO;
extern BYTE CDC_Music_NO;
extern BYTE CDC_Mode;
typedef union IR_data_tag {
unsigned char data_code[2];
unsigned int custom;
}IR_data;
extern BYTE Key_Code;
#pragma section data IR_State
unsigned char IR_State = IR_IDLE;
// during every 2ms,use P73 as synchronous clock,searial data
//every Data_2_Main has 8 BYTEs,every BYTE has 2ms interrupt
void Send_Data_2_Main(void)
{
BYTE DBR1,i,Bit_Index,Byte_Index,tmp_data;
for(Byte_Index=0;Byte_Index<8;Byte_Index++)
{
DBR1=DATA_2_Main[Byte_Index];
tmp_data=0x80;
for(Bit_Index=8;Bit_Index>=1;Bit_Index--) //synchronous clock=18us,
{
MAIN_CLK=0;
if(DBR1&tmp_data) //current bit=1,inverse to 0
MAIN_DATA=0;
else
MAIN_DATA=1;
MAIN_CLK=1;
tmp_data>>=1;
}
MAIN_CLK=0;
for(i=0;i<0xff;i++) //every 1.5ms,send 1 BYTE (original panasonic is 2ms)
{
__asm("NOP");
__asm("NOP");
__asm("NOP");
__asm("NOP");
}
}
}
void Transmit_Main_2_CDC()
{
//according to specification's "Reference Data","3.Communication Data of 'E-07'"
//When destination disc does not exist,CDC automatically turn to next disc,...
BYTE Key_Order,i,j,k,n;
if((Key_Code==0xe4))
{
for(n=0;n<2;n++)
{
DATA_2_Main[0]=0xeb;
DATA_2_Main[1]=CDC_Disc_NO;
DATA_2_Main[2]=CDC_Music_NO;
DATA_2_Main[3]=0x00;
DATA_2_Main[4]=0x00;
DATA_2_Main[5]=0x00;
DATA_2_Main[6]=0x70;
DATA_2_Main[7]=0xe3;
Send_Data_2_Main();
}
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
}
if((Key_Code==0x14)||(Key_Code==0xe4))
{
for(n=0;n<2;n++)
{
for(i=1;i<=6;i++)
{
DATA_2_Main[0]=0x4b;
DATA_2_Main[1]=0xd0+i;
DATA_2_Main[2]=0xff;
DATA_2_Main[3]=0;
DATA_2_Main[4]=0;
DATA_2_Main[5]=0;
DATA_2_Main[6]=0;
DATA_2_Main[7]=0x43;
Send_Data_2_Main();
for(j=0;j<0xff;j++) //the time to wait is important
for(k=0;k<0x0b;k++)
__asm("NOP");
DATA_2_Main[0]=0x4b;
DATA_2_Main[1]=CDC_Disc_NO;
DATA_2_Main[2]=CDC_Music_NO;
DATA_2_Main[3]=0x00;
DATA_2_Main[4]=0x00;
DATA_2_Main[5]=0x00;
DATA_2_Main[6]=0x10;
DATA_2_Main[7]=0x43;
Send_Data_2_Main();
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
}
for(i=1;i<=6;i++)
{
DATA_2_Main[0]=0x6b;
DATA_2_Main[1]=0xd0+i;
DATA_2_Main[2]=0xff;
DATA_2_Main[3]=0;
DATA_2_Main[4]=0;
DATA_2_Main[5]=0;
DATA_2_Main[6]=0;
DATA_2_Main[7]=0x63;
Send_Data_2_Main();
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
DATA_2_Main[0]=0x6b;
DATA_2_Main[1]=CDC_Disc_NO;
DATA_2_Main[2]=CDC_Music_NO;
DATA_2_Main[3]=0x00;
DATA_2_Main[4]=0x00;
DATA_2_Main[5]=0x00;
DATA_2_Main[6]=0x51;
DATA_2_Main[7]=0x63;
Send_Data_2_Main();
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
}
}
}
if((Key_Code==0xa4))
{
for(n=0;n<2;n++)
{
for(i=1;i<=6;i++)
{
DATA_2_Main[0]=0x6b;
DATA_2_Main[1]=0xd0+i;
DATA_2_Main[2]=0xff;
DATA_2_Main[3]=0;
DATA_2_Main[4]=0;
DATA_2_Main[5]=0;
DATA_2_Main[6]=0;
DATA_2_Main[7]=0x63;
Send_Data_2_Main();
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
DATA_2_Main[0]=0x6b;
DATA_2_Main[1]=CDC_Disc_NO;
DATA_2_Main[2]=CDC_Music_NO;
DATA_2_Main[3]=0x00;
DATA_2_Main[4]=0x00;
DATA_2_Main[5]=0x00;
DATA_2_Main[6]=0x10;
DATA_2_Main[7]=0x63;
Send_Data_2_Main();
for(j=0;j<0xff;j++)
for(k=0;k<0x0b;k++)
__asm("NOP");
}
}
}
//Translate begin...
switch(Key_Code)
{
case _AMFM_KEYCODE: //stop CDC
Key_Order=_AMFM_KEY;
break;
case _Query_CDC_Status_KEYCODE: //Query_CDC_status
Key_Order= _Query_CDC_Status_KEY;
break;
case _SEARCH_CDC_KEYCODE: //
// Key_Order=_SEARCH_CDC_KEY; //must set this disable
Key_Order=_Query_CDC_Status_KEY;
break; //useful
case _PLAY_KEYCODE: //play CDC(current disc,music)
Key_Order=_PLAY_KEY;
break;
case _SCAN_KEYCODE: //scan CDC
if(CDC_Mode==4)
{
CDC_Mode=1;
Key_Order=_RETURN_2_PLAY_KEY;
}
else
{
CDC_Mode=4;
Key_Order=_SCAN_KEY;
}
break;
case _PALY_2_SFL_KEYCODE: //Shuffle CDC
if(CDC_Mode==3)
{
CDC_Mode=1;
Key_Order=_RETURN_2_PLAY_KEY;
}
else
{
CDC_Mode=3;
Key_Order=_PALY_2_SFL_KEY;
}
break;
case _NEXT_KEYCODE: // next music.use Music search code
Key_Order=_NEXT_KEY;
break;
case _PREVIOUS_KEYCODE: //Previous music.use Music Search Code
Key_Order=_PREVIOUS_KEY;
break;
case _DISC1_KEYCODE: // Search Disc1 Code
Key_Order=_DISC1_KEY;
break;
case _DISC2_KEYCODE: // Search Disc2 Code
Key_Order=_DISC2_KEY;
break;
case _DISC3_KEYCODE: // Search Disc3 Code
Key_Order=_DISC3_KEY;
break;
case _DISC4_KEYCODE: // Search Disc4 Code
Key_Order=_DISC4_KEY;
break;
case _DISC5_KEYCODE: // Search Disc5 Code
Key_Order=_DISC5_KEY;
break;
case _DISC6_KEYCODE: // Search Disc6 Code
Key_Order=_DISC6_KEY;
break;
case _Query_CDC_Exist_KEYCODE: //Query_CDC_Exist status,Connection Check Command
Key_Order= _Query_CDC_Exist_KEY;
break;
}
DATA_2_CDC[0]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[0];
DATA_2_CDC[1]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[1];
DATA_2_CDC[2]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[2];
DATA_2_CDC[3]=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].data_code[3];
Total_Bit_2_CDC=Table_DATA_2_CDC[Key_Order+(CDC_Type-1)*_KEY_COUNT].bitcount;
//Transmit begin...
if(Total_Bit_2_CDC>0)
Send_Data_2_CDC();
}
//1000ms to resend data to main
void __interrupt INT_ReSend_Data_2_Main(void)
{
Send_Data_2_Main();
}
void irKey_convert(void)
{
BYTE i,j,k;
if (Key_Code == _NO_KEYCODE) return;
// EIR=EIR & (~EF15); //close p20
if (Key_Code == _AMFM_KEYCODE)
{
Transmit_Main_2_CDC();
for(i=0;i<0xff;i++)
{
for(j=0;j<0xff;j++)
__asm("NOP");
}
Transmit_Main_2_CDC();
return;
}
if (Key_Code == _PLAY_KEYCODE)
{
Transmit_Main_2_CDC();
for(i=0;i<0xff;i++)
{
for(j=0;j<0xff;j++)
__asm("NOP");
}
Transmit_Main_2_CDC();
for(i=0;i<0xff;i++)
{
for(j=0;j<0xff;j++)
__asm("NOP");
}
Transmit_Main_2_CDC();
for(i=0;i<0xff;i++)
{
for(j=0;j<0xff;j++)
__asm("NOP");
}
}
Transmit_Main_2_CDC();
Key_Code = _NO_KEYCODE;
}
void __interrupt INT_MAIN_DATA(void)
{
static unsigned char count;
static IR_data ir_data;
unsigned char Remote_Pulse_Time;
Remote_Pulse_Time = TREG3A; /* fetch timer value, reset timer counter */
if (Remote_Pulse_Time >= 0xf0) { /* capture overflow */
IR_State = IR_IDLE;
return;
}
/* process IR */
switch (IR_State) {
case IR_IDLE:
IR_State = IR_LEADER;
break;
case IR_LEADER:
if((Remote_Pulse_Time > (13690/128-IRERR)) && (Remote_Pulse_Time < (13690/128+IRERR))) {
IR_State = IR_CUSTOM; /* IR leader end */
count = 0;
return;
}
else
IR_State = IR_IDLE;
break;
case IR_CUSTOM: /* IR_CUSTOM */
if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR)))
{ /* receive bit "0", mid val = 1125 */
ir_data.custom <<= 1;
}
else {
if((Remote_Pulse_Time > (2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR)))
/* receive bit "1", mid val = 2250 */
ir_data.custom = (ir_data.custom << 1) | 0x0001;
else {
IR_State = IR_IDLE;
return;
}
}
count++;
if(count == 16)
{
IR_State = IR_DATA; /* start data recevie */
count = 0;
ir_data.custom = 0;
}
break;
case IR_DATA: /* data proccess */
count++;
if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR))) /* receive bit "0", mid val = 1144 */
ir_data.data_code[0] <<= 1;
else {
if((Remote_Pulse_Time > (2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR))) /* receive bit "1", mid val = 2288 */
ir_data.data_code[0] = (ir_data.data_code[0] << 1) | 0x01;
else {
IR_State = IR_IDLE;
return;
}
}
if(count == 8) {
IR_State =IR_NON_DATA ;
count = 0;
}
break;
case IR_NON_DATA: /* non-data proccess */
count++;
if((Remote_Pulse_Time > (1144/128-IRERR)) && (Remote_Pulse_Time < (1144/128+IRERR))) /* receive bit "0", mid val = 1144 */
{
ir_data.data_code[1] <<= 1;
}
else
{
if((Remote_Pulse_Time > (2288/128-IRERR)) && (Remote_Pulse_Time < (2288/128+IRERR))) /* receive bit "1", mid val = 2288 */
{
ir_data.data_code[1] = (ir_data.data_code[1] << 1) | 0x01;
}
else
{
IR_State = IR_IDLE;
return;
}
}
if(count == 8)
{
IR_State = IR_IDLE;
if(ir_data.data_code[0] == (255-ir_data.data_code[1]))
{
Key_Code = ir_data.data_code[0];
key_contiune_process:
irKey_convert();
}
}
break;
default:
IR_State = IR_IDLE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -