//------------------------------------------------------------------------------ u08 AVCLan_Read_ACK() { u08 time = 0; AVC_SET_1(); delay1(19); AVC_SET_0(); delay1(1); AVC_OUT_DIS(); // switch to read mode timer0_source(CK64); timer0_start(); while(1) { time = TCNT0; if (INPUT_IS_SET && (time > 1)) break; if (time > 20) return 1; } while(INPUT_IS_SET); AVC_OUT_EN();// back to write mode return 0; }
//------------------------------------------------------------------------------ u08 AVCLan_SendDataBroadcast() { u08 i; STOPEvent; // wait for free line u08 T=0; u08 line_busy = 1; timer0_source(CK64); timer0_start(); do { while (INPUT_IS_CLEAR) { T = TCNT0; if (T >= 25) break; } if (T > 24) line_busy=0; } while (line_busy); AVC_OUT_EN(); AVCLan_Send_StartBit(); AVCLan_Send_Byte(0x0, 1); // broadcast parity_bit = 0; AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master AVCLan_Send_Byte(CD_ID_2, 8); AVCLan_Send_ParityBit(); AVCLan_Send_Byte(0x1, 4); // all audio devices AVCLan_Send_Byte(0xFF, 8); AVCLan_Send_ParityBit(); AVCLan_Send_Bit1(); AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE AVCLan_Send_ParityBit(); AVCLan_Send_Bit1(); AVCLan_Send_Byte(data_len, 8); // data lenght AVCLan_Send_ParityBit(); AVCLan_Send_Bit1(); for (i=0;i<data_len;i++) { AVCLan_Send_Byte(data[i], 8); // data byte AVCLan_Send_ParityBit(); AVCLan_Send_Bit1(); } AVC_OUT_DIS(); STARTEvent; if (showLog) ShowOutMessage(); return 0; }
void Wait1msForAVCLan() { timer0_source(CK64); u08 T; // check start bit timer0_start(); while (!INPUT_IS_SET) { T=inp(TCNT0); if (T>100) { return; } } };
//------------------------------------------------------------------------------ u08 AVCLan_Send_ACK() { timer0_source(CK64); //update every 1us timer0_start(); while (INPUT_IS_CLEAR) { if (TCNT0 >= 25) return 0; // max wait time } AVC_OUT_EN(); AVC_SET_1(); delay1(32); //28-37 AVC_SET_0(); delay1(4); //00-09 AVC_OUT_DIS(); return 1; }
//------------------------------------------------------------------------------ void AVC_HoldLine() { STOPEvent; // wait for free line u08 T=0; u08 line_busy = 1; timer0_source(CK64); timer0_start(); do { while (INPUT_IS_CLEAR) { T = TCNT0; if (T >= 25) break; } if (T > 24) line_busy=0; } while (line_busy); // switch to out mode AVC_OUT_EN(); AVC_SET_1(); STARTEvent; }
//------------------------------------------------------------------------------ u08 AVCLan_SendData() { u08 i; STOPEvent; // wait for free line u08 T=0; u08 line_busy = 1; timer0_source(CK64); timer0_start(); do { while (INPUT_IS_CLEAR) { T = TCNT0; if (T >= 25) break; } if (T > 24) line_busy=0; } while (line_busy); // switch to output mode AVC_OUT_EN(); AVCLan_Send_StartBit(); AVCLan_Send_Byte(0x1, 1); // regular communication parity_bit = 0; AVCLan_Send_Byte(CD_ID_1, 4); // CD Changer ID as master AVCLan_Send_Byte(CD_ID_2, 8); AVCLan_Send_ParityBit(); AVCLan_Send_Byte(HU_ID_1, 4); // HeadUnit ID as slave AVCLan_Send_Byte(HU_ID_2, 8); AVCLan_Send_ParityBit(); if (AVCLan_Read_ACK()) { AVC_OUT_DIS(); STARTEvent; RS232_Print("E1\n"); return 1; } AVCLan_Send_Byte(0xF, 4); // 0xf - control -> COMMAND WRITE AVCLan_Send_ParityBit(); if (AVCLan_Read_ACK()) { AVC_OUT_DIS(); STARTEvent; RS232_Print("E2\n"); return 2; } AVCLan_Send_Byte(data_len, 8);// data lenght AVCLan_Send_ParityBit(); if (AVCLan_Read_ACK()) { AVC_OUT_DIS(); STARTEvent; RS232_Print("E3\n"); return 3; } for (i=0;i<data_len;i++) { AVCLan_Send_Byte(data[i], 8);// data byte AVCLan_Send_ParityBit(); if (AVCLan_Read_ACK()) { AVC_OUT_DIS(); STARTEvent; RS232_Print("E4("); RS232_PrintDec(i); RS232_Print(")\n"); return 4; } } // back to read mode AVC_OUT_DIS(); STARTEvent; if (showLog) ShowOutMessage(); return 0; }
//------------------------------------------------------------------------------ u08 AVCLan_Read_Message() { STOPEvent; // disable timer1 interrupt u08 T = 0; u08 i; u08 for_me = 0; //RS232_Print("$ "); timer0_source(CK64); // check start bit timer0_start(); while (INPUT_IS_SET) { T=TCNT0; if (T>254) { STARTEvent; RS232_Print("LAN>T1\n"); return 0; } } if (T<10) { // !!!!!!! 20 !!!!!!!!!!! STARTEvent; RS232_Print("LAN>T2\n"); return 0; } broadcast = AVCLan_Read_Byte(1); parity_bit = 0; master1 = AVCLan_Read_Byte(4); master2 = AVCLan_Read_Byte(8); if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { STARTEvent; return 0; } parity_bit = 0; slave1 = AVCLan_Read_Byte(4); slave2 = AVCLan_Read_Byte(8); if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { STARTEvent; return 0; } // is this command for me ? if ((slave1==CD_ID_1)&&(slave2==CD_ID_2)) { for_me=1; } if (for_me) AVCLan_Send_ACK(); else AVCLan_Read_Byte(1); parity_bit = 0; AVCLan_Read_Byte(4); // control - always 0xF if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { STARTEvent; return 0; } if (for_me) AVCLan_Send_ACK(); else AVCLan_Read_Byte(1); parity_bit = 0; message_len = AVCLan_Read_Byte(8); if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { STARTEvent; return 0; } if (for_me) AVCLan_Send_ACK(); else AVCLan_Read_Byte(1); if (message_len > MAXMSGLEN) { // RS232_Print("LAN> Command error"); STARTEvent; return 0; } for (i=0; i<message_len; i++) { parity_bit = 0; message[i] = AVCLan_Read_Byte(8); if ((parity_bit&1)!=AVCLan_Read_Byte(1)) { STARTEvent; return 0; } if (for_me) { AVCLan_Send_ACK(); } else { AVCLan_Read_Byte(1); } } STARTEvent; if (showLog) ShowInMessage(); if (for_me) { if (CheckCmd((u08*)stat1)) { answerReq = cmStatus1; return 1; } if (CheckCmd((u08*)stat2)) { answerReq = cmStatus2; return 1; } if (CheckCmd((u08*)stat3)) { answerReq = cmStatus3; return 1; } if (CheckCmd((u08*)stat4)) { answerReq = cmStatus4; return 1; } // if (CheckCmd((u08*)stat5)) { answerReq = cmStatus5; return 1; } if (CheckCmd((u08*)play_req1)) { answerReq = cmPlayReq1; return 1; } if (CheckCmd((u08*)play_req2)) { answerReq = cmPlayReq2; return 1; } if (CheckCmd((u08*)play_req3)) { answerReq = cmPlayReq3; return 1; } if (CheckCmd((u08*)stop_req)) { answerReq = cmStopReq; return 1; } if (CheckCmd((u08*)stop_req2)) { answerReq = cmStopReq2; return 1; } } else { // broadcast check if (CheckCmd((u08*)lan_playit)) { answerReq = cmPlayIt; return 1; } if (CheckCmd((u08*)lan_check)) { answerReq = cmCheck; CMD_CHECK[6]=message[3]; return 1; } if (CheckCmd((u08*)lan_reg)) { answerReq = cmRegister; return 1; } if (CheckCmd((u08*)lan_init)) { answerReq = cmInit; return 1; } if (CheckCmd((u08*)lan_stat1)) { answerReq = cmStatus1; return 1; } } answerReq = cmNull; return 1; }