summaryrefslogtreecommitdiff
path: root/libraries/OBD/OBD.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/OBD/OBD.cpp')
-rw-r--r--libraries/OBD/OBD.cpp109
1 files changed, 90 insertions, 19 deletions
diff --git a/libraries/OBD/OBD.cpp b/libraries/OBD/OBD.cpp
index 162ca85..d551f93 100644
--- a/libraries/OBD/OBD.cpp
+++ b/libraries/OBD/OBD.cpp
@@ -73,7 +73,7 @@ void COBD::sendQuery(byte pid)
write(cmd);
}
-bool COBD::read(byte pid, int& result)
+bool COBD::readPID(byte pid, int& result)
{
// send a query command
sendQuery(pid);
@@ -81,7 +81,7 @@ bool COBD::read(byte pid, int& result)
return getResult(pid, result);
}
-byte COBD::read(const byte pid[], byte count, int result[])
+byte COBD::readPID(const byte pid[], byte count, int result[])
{
// send a multiple query command
char buffer[128];
@@ -249,11 +249,26 @@ void COBD::sleep()
sendCommand("ATLP\r", buf, sizeof(buf));
}
+char* COBD::getResultValue(char* buf)
+{
+ char* p = buf;
+ for (;;) {
+ if (isdigit(*p) || *p == '-') {
+ return p;
+ }
+ p = strchr(p, '\r');
+ if (!p) break;
+ if (*(++p) == '\n') p++;
+ }
+ return 0;
+}
+
float COBD::getVoltage()
{
char buf[32];
if (sendCommand("ATRV\r", buf, sizeof(buf)) > 0) {
- return atof(buf);
+ char* p = getResultValue(buf);
+ if (p) return atof(p);
}
return 0;
}
@@ -295,6 +310,16 @@ void COBD::begin()
DEBUG.begin(115200);
#endif
recover();
+
+ char buffer[32];
+ version = 0;
+ if (sendCommand("ATI\r", buffer, sizeof(buffer), 200)) {
+ char *p = strstr(buffer, "OBDUART");
+ if (p) {
+ p += 9;
+ version = (*p - '0') * 10 + (*(p + 2) - '0');
+ }
+ }
}
byte COBD::receive(char* buffer, byte bufsize, int timeout)
@@ -343,15 +368,6 @@ bool COBD::init(OBD_PROTOCOLS protocol)
m_state = OBD_CONNECTING;
- write("ATI\r");
- if (receive(buffer, sizeof(buffer), 100)) {
- char *p = strstr(buffer, "OBDUART");
- if (p) {
- p += 9;
- version = (*p - '0') * 10 + (*(p + 2) - '0');
- }
- }
-
for (unsigned char i = 0; i < sizeof(initcmd) / sizeof(initcmd[0]); i++) {
#ifdef DEBUG
debugOutput(initcmd[i]);
@@ -408,6 +424,50 @@ bool COBD::setBaudRate(unsigned long baudrate)
}
+float COBD::getTemperature()
+{
+ char buf[32];
+ if (sendCommand("ATTEMP\r", buf, sizeof(buf)) > 0) {
+ char* p = getResultValue(buf);
+ if (p) return (float)(atoi(p) + 12412) / 340;
+ }
+ else {
+ return -1000;
+ }
+}
+
+bool COBD::readAccel(int& x, int& y, int& z)
+{
+ char buf[32];
+ if (sendCommand("ATACL\r", buf, sizeof(buf)) > 0) do {
+ char* p = getResultValue(buf);
+ if (!p) break;
+ x = atoi(p++);
+ if (!(p = strchr(p, ','))) break;
+ y = atoi(++p);
+ if (!(p = strchr(p, ','))) break;
+ z = atoi(++p);
+ return true;
+ } while (0);
+ return false;
+}
+
+bool COBD::readGyro(int& x, int& y, int& z)
+{
+ char buf[32];
+ if (sendCommand("ATGYRO\r", buf, sizeof(buf)) > 0) do {
+ char* p = getResultValue(buf);
+ if (!p) break;
+ x = atoi(p++);
+ if (!(p = strchr(p, ','))) break;
+ y = atoi(++p);
+ if (!(p = strchr(p, ','))) break;
+ z = atoi(++p);
+ return true;
+ } while (0);
+ return false;
+}
+
#ifdef DEBUG
void COBD::debugOutput(const char *s)
{
@@ -429,6 +489,16 @@ void COBDI2C::begin()
DEBUG.begin(115200);
#endif
recover();
+
+ char buffer[32];
+ version = 0;
+ if (sendCommand("ATI\r", buffer, sizeof(buffer), 200)) {
+ char *p = strstr(buffer, "OBDUART");
+ if (p) {
+ p += 9;
+ version = (*p - '0') * 10 + (*(p + 2) - '0');
+ }
+ }
}
void COBDI2C::end()
@@ -436,7 +506,7 @@ void COBDI2C::end()
m_state = OBD_DISCONNECTED;
}
-bool COBDI2C::read(byte pid, int& result)
+bool COBDI2C::readPID(byte pid, int& result)
{
sendQuery(pid);
dataIdleLoop();
@@ -469,7 +539,7 @@ byte COBDI2C::receive(char* buffer, byte bufsize, int timeout)
do {
Wire.requestFrom((byte)I2C_ADDR, (byte)MAX_PAYLOAD_SIZE, (byte)1);
int c = Wire.read();
- if (offset == 0 && (c == 0 || c == -1)) {
+ if (offset == 0 && c < 0xa) {
// data not ready
dataIdleLoop();
continue;
@@ -492,21 +562,22 @@ byte COBDI2C::receive(char* buffer, byte bufsize, int timeout)
}
}
} while(millis() - start < timeout);
+ if (buffer) buffer[offset] = 0;
return 0;
}
-byte COBDI2C::read(const byte pid[], byte count, int result[])
+byte COBDI2C::readPID(const byte pid[], byte count, int result[])
{
byte results = 0;
for (byte n = 0; n < count; n++) {
- if (read(pid[n], result[n])) {
+ if (readPID(pid[n], result[n])) {
results++;
}
}
return results;
}
-void COBDI2C::setPID(byte pid, byte obdPid[])
+void COBDI2C::setQueryPID(byte pid, byte obdPid[])
{
byte n = 0;
for (; n < MAX_PIDS && obdPid[n]; n++) {
@@ -520,13 +591,13 @@ void COBDI2C::setPID(byte pid, byte obdPid[])
obdPid[n] = pid;
}
-void COBDI2C::applyPIDs(byte obdPid[])
+void COBDI2C::applyQueryPIDs(byte obdPid[])
{
sendCommandBlock(CMD_APPLY_OBD_PIDS, 0, (byte*)obdPid, sizeof(obdPid[0])* MAX_PIDS);
delay(200);
}
-void COBDI2C::loadData(PID_INFO obdInfo[])
+void COBDI2C::loadQueryData(PID_INFO obdInfo[])
{
sendCommandBlock(CMD_LOAD_OBD_DATA);
dataIdleLoop();