system
3
//Requests the PID and returns the calculated PID result.
byte get_PID(byte PID, long *result, char *result_str)
{
byte str_cr[16]; //String for compact response data.
char str_tx[16]; //String for STN transmit data.
char str_rx[16]; //String for STN receive data.
sprintf_P(str_tx, PSTR("01%02X\r"), PID);
STN_Transmit(str_tx);
if(STN_Read(str_rx) == 0)
{
Serial.print(str_rx);
strcpy_P(result_str, PSTR("rERR"));
return 0;
}
Serial.print(str_rx);
if(STN_Response_Header_Check(str_tx, str_rx) == 0)
{
strcpy_P(result_str, PSTR("hERR"));
return 0;
}
STN_Response_Convert(str_cr, str_rx);
switch(PID)
{
case CEL:
*result = (str_cr[0] * 100) / 255;
sprintf_P(result_str, PSTR("%ld %%"), *result);
break;
case ECT:
*result = str_cr[0] - 40;
break;
case FP:
*result = str_cr[0] * 3;
sprintf_P(result_str, PSTR("%ld kPa"), *result);
break;
case ERPM:
*result = ((str_cr[0] * 256) + str_cr[1]) / 4;
sprintf_P(result_str, PSTR("%ld RPM"), *result);
break;
case VS:
*result = (str_cr[0] * 10000U) / 16090U;
sprintf_P(result_str, PSTR("%ld MPH"), *result);
break;
case MAF:
*result = ((str_cr[0] * 256) + str_cr[1]) / 100;
sprintf_P(result_str, PSTR("%ld g/s"), *result);
case TP:
*result = (str_cr[0] * 100) / 255;
sprintf_P(result_str, PSTR("%ld %%"), *result);
break;
case FLI:
*result = (100 * str_cr[0]) / 255;
sprintf_P(result_str, PSTR("%ld %%"), *result);
break;
case AAT:
*result = str_cr[0] -40;
break;
case EOT:
*result = str_cr[0] - 40;
break;
case EFR:
*result =((str_cr[0] * 256) + str_cr[1]) * 0.05;
sprintf_P(result_str, PSTR("%ld L/h"), *result);
break;
}
return 0;
}
boolean Check_Supported_PID(byte PID)
{
if(PID == 0)
{
return true;
}
else if(PID >= 0x21 && PID <= 0x20)
{
}
else if(PID >= 0x21 &&PID <= 0x40)
{
}
else if(PID >= 0x41 && PID <= 0x60)
{
}
}
//Transmits ASCII encoded HEX data to the ELM IC.
//For example 010C\r.
void STN_Transmit(char *str)
{
SoftwareSerial.print(str);
}
//Places a command into a string to be transmitted.
byte STN_Command(char *str_cmd, char *cmd)
{
strcpy_P(str_cmd, cmd);
STN_Transmit(str_cmd);
return STN_Read(str_cmd);
}
//Reads data from the ELM IC.
//For example 41 0C 7B 7B>.
byte STN_Read(char *str)
{
byte i = 0;
char temp;
while((temp = Serial.read()) != '>')
{
if(temp >= ' ' && temp <= '~')
{
str[i++] = temp;
}
}
if(i > 16)
{
Serial.println(i);
Serial.flush();
return 0;
}
else
{
str[i] = '\0';
return 1; //No data to read or buffer full.
}
}
//Checks the ELM response header against the transmited header.
byte STN_Response_Header_Check(char *str_tx, char *str_rx)
{
if(str_rx[1] == str_tx[1] && str_rx[3] == str_tx[2] && str_rx[4] == str_tx[3])
{
return 1; //Header check is good.
}
else
{
return 0; //Header check is bad.
}
}
//Skips the header and converts the received string to HEX.
//For example 7B 7B to 0x7B7B.
void STN_Response_Convert(byte *str_cr, char *str_rx)
{
byte i = 0;
str_rx += 6;
while(*str_rx != '\0')
str_cr[i++] = strtoul(str_rx, &str_rx, 16);
}
int freeRam(void)
{
extern unsigned int __heap_start;
extern void *__brkval;
int free_memory;
int stack_here;
if (__brkval == 0)
free_memory = (int) &stack_here - (int) &__heap_start;
else
free_memory = (int) &stack_here - (int) __brkval;
return (free_memory);
}