EBO-77/Sources/diagnostic/diagnostic_service_slave.c
2024-12-23 11:04:44 +08:00

454 lines
12 KiB
C

#include "lin_cfg.h"
#include "diagnostic_service_slave.h"
#include "diagnostic_DID.h"
#include "DMK-BC316-77.h"
//extern byte LED_value;
const unsigned long serial_number = SERIAL_NUBER_INT; /* for read & write serial_number services */
const unsigned char io_control_status = IO_CONTROL_STATUS_INT; /* for read & set io */
const unsigned int session_control_P3 = SESSION_CONTROL_P3; /* for session control service */
const unsigned int session_control_P3Ex = SESSION_CONTROL_P3Ex; /* for session control service */
const unsigned char DtcStatusByte = DTCSTATUSBTYE_INT ; /* for fault memory */
const unsigned char DtcFormatIdentifier = DTCFORMATIDENTIFER_INT; /* for fault memory */
const unsigned char CountDtc = COUNTDTC_INT; /* for fault memory */
const TYPE_DIAGSERVICEARR DiagServiceCheckArr[DEF_DIAGSERVICE_COUNT]={
{DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER,&diagsrv_read_data_by_identifier},//22
{DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER,&diagsrv_write_data_by_identifier},//2E
{DIAGSRV_SESSION_CONTROL_ORDER,&diagsrv_session_control},//10
{DIAGSRV_TESTERPRESENT_ORDER,&diagsrv_tester_present},//3E
{DIAGSRV_ECURESET_ORDER,&diagsrv_ECU_reset},//00
{DIAGSRV_COMMUNICATIONCONTROL_ORDER,&diagsrv_communication_control},//28
{DIAGSRV_ROUTINECONTROL_ORDER,&diagsrv_routine_control},//31
{DIAGSRV_ASSIGN_FRAME_ID_RANGE_ORDER,&diagsrv_B7},//B7
};
/**/
volatile l_u8 master_req_dat[MASTER_REQ_LENGTH_MAX];
volatile l_u16 master_req_length;
volatile l_u8 slave_resp_dat[MASTER_REQ_LENGTH_MAX];
volatile l_u16 slave_resp_length;
l_u8 resetflag=0;
void diagsrv_routine_control(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length != 4)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
if(master_req_dat[1] == 0x01)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x12;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
}
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_ROUTINECONTROL_ORDER);
}
void diagsrv_communication_control(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length != 3)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
if((master_req_dat[1]&0x7f) == 0x00 || (master_req_dat[1]&0x7f) == 0x01)
{
slave_resp_length = 3;
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
slave_resp_dat[2] = master_req_dat[2];
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
}
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_COMMUNICATIONCONTROL_ORDER);
}
void diagsrv_ECU_reset(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length != 2)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
if(master_req_dat[1] == 0x01)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x22;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
}
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_ECURESET_ORDER);
}
void diagsrv_tester_present(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length != 2)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
if(master_req_dat[1] == 0x00)
{
slave_resp_length = 2;
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else if(master_req_dat[1] == 0x80)
{
;//0x80ÎÞÏìÓ¦
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
}
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_TESTERPRESENT_ORDER);
}
void diagsrv_read_data_by_identifier(void)
{
/* Implement code of this service here */
unsigned char i;
unsigned int DID_id;
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
DID_id = master_req_dat[1];
DID_id <<= 8;
DID_id |= master_req_dat[2];
if(master_req_length != 3)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
diag_clear_flag(DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER);
return;
}
for(i=0;i<DEF_DID_NUM;i++)
{
if(DID_CheckArr[i].DID_id == DID_id)
{
DID_CheckArr[i].DID_Func(DID_CheckArr[i].length,(unsigned char *)slave_resp_dat+3);
slave_resp_length = 3+DID_CheckArr[i].length;
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
slave_resp_dat[2] = master_req_dat[2];
break;
}
}
if(DEF_DID_NUM == i)
{
;/* ·ñ¶¨ÏìÓ¦£¬²»Ö§³ÖÏìÓ¦DID */
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
}
/* get data from queue to data */
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_READ_DATA_BY_IDENTIFIER_ORDER);
}
#ifdef DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER
void diagsrv_write_data_by_identifier(void)
{
unsigned char conf,i;
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
/* process data */
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_WRITE_DATA_BY_IDENTIFIER_ORDER);
}
#endif
void diagsrv_session_control(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length != 2)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
if(master_req_dat[1] == 0x02)
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x22;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else if(master_req_dat[1] == 0x03)
{
slave_resp_length = 6;
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
slave_resp_dat[2] = 0x00;
slave_resp_dat[3] = 0x32;
slave_resp_dat[4] = 0x27;
slave_resp_dat[5] = 0x10;
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else if(master_req_dat[1] == 0x83)
{
;// 0x80 ÎÞÏìÓ¦
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x31;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
}
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_ECURESET_ORDER);
diag_clear_flag(DIAGSRV_SESSION_CONTROL_ORDER);
}
void diagsrv_io_control_by_identifier(void)
{
/* process recieved data from master request */
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
diag_clear_flag(DIAGSRV_IO_CONTROL_BY_IDENTIFIER_ORDER);
}
void diagsrv_fault_memory_read(void)
{
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
/* Implement code of this service here */
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
slave_resp_dat[2] = master_req_dat[2];
slave_resp_dat[3] = DtcStatusByte;
slave_resp_dat[4] = DtcFormatIdentifier;
slave_resp_dat[5] = CountDtc;
slave_resp_length = 0x06;
/* send a message to master */
ld_send_message((l_u16)slave_resp_length,(l_u8*)slave_resp_dat);
/*clear diagnostic flag */
lin_diag_services_flag[DIAGSRV_FAULT_MEMORY_READ_ORDER] = 0;
}
void diagsrv_fault_memory_clear(void)
{
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
/* Implement code of this service here */
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
slave_resp_dat[2] = master_req_dat[2];
slave_resp_length = 0x03;
/* Implement code of this service here */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
/*clear diagnostic flag */
diag_clear_flag(DIAGSRV_FAULT_MEMORY_CLEAR_ORDER);
//lin_diag_services_flag[DIAGSRV_FAULT_MEMORY_CLEAR_ORDER] = 0;
}
void diagsrv_B7(void)
{
ld_receive_message((l_u16*)&master_req_length, (l_u8*)master_req_dat);
if(master_req_length == 0x06)
{
slave_resp_length = 2;
slave_resp_dat[0] = master_req_dat[0] + 0x40;
slave_resp_dat[1] = master_req_dat[1];
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
else
{
slave_resp_length = 3;
slave_resp_dat[0] = 0x7F;
slave_resp_dat[1] = master_req_dat[0];
slave_resp_dat[2] = 0x13;//·ñ¶¨ÏìÓ¦Âë
/* send a message to master */
ld_send_message((l_u16)slave_resp_length, (l_u8*)slave_resp_dat);
}
diag_clear_flag(DIAGSRV_ASSIGN_FRAME_ID_RANGE_ORDER);
}
void diagsrv_security_access(void)
{
}
void diagsrv_send_data(void)
{
ld_receive_message((l_u16*)&master_req_length,(l_u8*)master_req_dat);
}
void diagsrv_download_request(void)
{
}
//extern volatile l_signal_handle slave_signal_handle;
extern volatile l_u8* slave_sig_data;
extern volatile unsigned char sw_flag;
void slave_diagnostic_task()
{
unsigned char i = 0x00;
unsigned char data;
for (i = 0; i < DEF_DIAGSERVICE_COUNT; i++)
{
if (diag_get_flag(DiagServiceCheckArr[i].DiagServiceFlagOrder))
{
DiagServiceCheckArr[i].DiagServiceFunc();
}
}
}
void SoftwareRest(void)
{
CPMUARMCOP = 0xff;
while(1);
}
void slave_diagnostic_init(void)
{
;
}
void SaveArray_LINResp(unsigned char * buf)
{
unsigned char i;
}
void ReadArray_LINResp(unsigned char * buf)
{
unsigned char i;
}
void SetConfiguration(unsigned char conf)
{
}
void resetDetect(void)
{
static resetcnt;
if(resetflag == 1)
{
resetcnt++;
if(resetcnt>10)
SoftwareRest();
}
else
{
resetcnt=0;
}
}