#include <CAN_GSM.h>
#define PROGRAM_DEBUG
#define CAN_USE_EXTENDED_ID FALSE
#define CAN_BRG_SEG_2_PHASE_TS TRUE
#define CAN_BRG_PRESCALAR 4
#define CAN_BRG_SYNCH_JUMP_WIDTH 0
#define CAN_BRG_PROPAGATION_TIME 2
#define CAN_BRG_PHASE_SEGMENT_1 5
#define CAN_BRG_PHASE_SEGMENT_2 5
#define CAN_BRG_WAKE_FILTER TRUE
#define CAN_BRG_SAM FALSE
#include <can-18F4580.c>
#include <Tick.c>
#define STACK_USE_SHA1 TRUE
#include <Hashes.c>
/**
*
*/
#define BroadcastID_11 0x7DF
#define BroadcastID_29 0X18DB33F1
int1 TimeOut;
struct OBD_Packet{
int8 NBYTES; //0 Numero bytes adicionales
int8 MODO; //1 Modo
int8 PID; //2 PID
int8 DATA[5]; //3 Data
};
struct ODB_MPacket{
int8 NRecibidos;
unsigned int32 Receipt_ID[8];
struct OBD_Packet OBDPacketToSave[8];
};
enum ERROR_CODE {
EC_OK=0,
EC_SENDBUFFERBUSY=1,
EC_TIMEOUT =2};
ERROR_CODE SendQuery(int32 ECU_ID,int8 MODE,int8 PID,struct ODB_MPacket *OBDPacket)
{
int8 i;
int8 Alen;
int8 ByteCheck;
struct rx_stat rxstat;
unsigned int32 ReceiptID;
static TICKTYPE lastTick;
TICKTYPE currTick;
struct OBD_Packet OBDPacketToSend;
struct OBD_Packet OBDFlowControlFrame;
OBDPacketToSend.NBYTES =0x02; //stardard packet
OBDPacketToSend.MODO =MODE; //Mostrar valor actual
OBDPacketToSend.PID =PID; //Mostrar PIS soportados
OBDPacketToSend.DATA[0] =0x55; //No usados 55h
OBDPacketToSend.DATA[1] =0x55;
OBDPacketToSend.DATA[2] =0x55;
OBDPacketToSend.DATA[3] =0x55;
OBDPacketToSend.DATA[4] =0x55;
OBDFlowControlFrame.NBYTES=0x30;
OBDFlowControlFrame.MODO=0x07;
OBDFlowControlFrame.PID=0xF9;
i=0;
*OBDPacket->NRecibidos=0;
if(can_tbe())
{
can_putd(ECU_ID,&OBDPacketToSend,8,3,0,0);
currTick = lastTick=TickGet();
TimeOut=False;
do
{
currTick = TickGet();
if(can_kbhit())
{
can_getd(ReceiptID,&OBDPacket->OBDPacketToSave[i],Alen,rxstat);
OBDPacket->NRecibidos=OBDPacket->NRecibidos+1;
//fprintf(DEBUG,"NRecibidos:%d\r\n",OBDPacket->NRecibidos);
OBDPacket->Receipt_ID[i]=ReceiptID;
//fprintf(DEBUG,"ReceiptID:%lx\r\n",OBDPacket->Receipt_ID[i]);
ByteCheck=OBDPacket->OBDPacketToSave[i].NBYTES;
//fprintf(DEBUG,"ByteCheck:%x\r\n",ByteCheck);
ByteCheck=ByteCheck&0xF0;
if (ByteCheck==0x10)
{
can_putd(ECU_ID,&OBDFlowControlFrame,3,3,0,0);
fprintf(DEBUG
,"First Frame detected\r\n"); }
else if (ByteCheck==0x20)
{
fprintf(DEBUG
,"Consecutive Frame detected\r\n"); }
i++;
}
else if (TickGetDiff(currTick, lastTick) > (TICKS_PER_SECOND*5)) //4 segundos lo iremos ajustando hacia abajo
{
TimeOut=True;
#ifdef PROGRAM_DEBUG
#endif
lastTick = currTick;
}
}while(!TimeOut); // cinco segundos o los datos
if(OBDPacket->NRecibidos!=0)
{
return(EC_OK);
}
else
{
return(EC_TIMEOUT);
}
}
else
{
return(EC_SENDBUFFERBUSY);
}
}
void main()
{
static struct ODB_MPacket OBDPacket;
Set_tris_a(0x00);
Set_tris_b(0x00);
Set_tris_c(0x80);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
TickInit();
can_init();
enable_interrupts(INT_RDA);
STACK_STATUS=GET_IMEI;
CASE_STATUS=SEND_CMD;
CONNECTION_STATUS=0;
MODEM_STATUS=0;
delay_ms(5000);
fprintf(DEBUG
,"Query Result%d\r\n",SendQuery
(BroadcastID_11
,0X01,0x00,&OBDPacket
)); while(true)
{
// GSM_STACK();
}
}