diff options
author | asanoaozora <fifitaneki@hotmail.com> | 2017-11-07 15:25:41 +0100 |
---|---|---|
committer | asanoaozora <fifitaneki@hotmail.com> | 2017-11-07 15:25:41 +0100 |
commit | 799b0a073bfa95ff351a80ae08b74adbd150d793 (patch) | |
tree | 86e4954b9173c8715d6c7e0f31318d6907d037fa | |
parent | c5887a31f13cd7ae1c5d184153fcc1f44a190bb9 (diff) | |
download | navigation-799b0a073bfa95ff351a80ae08b74adbd150d793.tar.gz |
extend vehicle gateway
-rw-r--r-- | src/vehicle-gateway/can.h | 53 | ||||
-rw-r--r-- | src/vehicle-gateway/common.h | 5 | ||||
-rw-r--r-- | src/vehicle-gateway/obd2.cpp | 209 | ||||
-rw-r--r-- | src/vehicle-gateway/obd2.h | 9 | ||||
-rw-r--r-- | src/vehicle-gateway/veh-gateway.cpp | 187 | ||||
-rw-r--r-- | test/script/dashboard.bmp | bin | 0 -> 800138 bytes |
6 files changed, 334 insertions, 129 deletions
diff --git a/src/vehicle-gateway/can.h b/src/vehicle-gateway/can.h new file mode 100644 index 0000000..2536e76 --- /dev/null +++ b/src/vehicle-gateway/can.h @@ -0,0 +1,53 @@ +/************************************************************************** +* @licence app begin@ +* +* SPDX-License-Identifier: MPL-2.0 +* +* \ingroup Vehicle gateway +* \author Philippe Colliot <philippe.colliot@mpsa.com> +* +* \copyright Copyright (C) 2017, PSA Group +* +* \license +* This Source Code Form is subject to the terms of the +* Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with +* this file, You can obtain one at http://mozilla.org/MPL/2.0/. +* +* @licence end@ +**************************************************************************/ + +#ifndef INCLUDE_CAN +#define INCLUDE_CAN + +#define CAN_MESSAGE_FILTER 0x123 +#define CAN_MESSAGE_MASK 0x7FF +#define CAN_MESSAGE_MAX_DATA_LENGTH 8 +//index is the index in the data frame, format is the length (ex: engine speed is 1758, index is 4 and format is 4 +//Engine speed frame: 20881758330040FFFF22 +// => 0x1758*0.125 = 5976*0.125 = 747 RPM +#define CAN_MESSAGE_ENGINE_SPEED_ID_AND_DATA_SIZE "2088" +#define CAN_MESSAGE_ENGINE_SPEED_INDEX 4 +#define CAN_MESSAGE_ENGINE_SPEED_FORMAT 4 +//Fuel level frame: 61267321013C0000 +// => 0x3C*0.5 = 60*0.5 = 30l +#define CAN_MESSAGE_FUEL_LEVEL_ID_AND_DATA_SIZE "6126" +#define CAN_MESSAGE_FUEL_LEVEL_INDEX 10 +#define CAN_MESSAGE_FUEL_LEVEL_FORMAT 2 +//Wheel ticks frame: 50D700091508EC8E90 +//rear left 0915 rear right 08EC filter 7FFF error bit 15 +#define CAN_MESSAGE_WHEEL_TICK_ID_AND_DATA_SIZE "50D7" +#define CAN_MESSAGE_RL_WHEEL_TICK_INDEX 6 +#define CAN_MESSAGE_RR_WHEEL_TICK_INDEX 10 +#define CAN_MESSAGE_WHEEL_TICK_FORMAT 4 + +#define CAN_ID_AND_DATA_SIZE_LENGTH 4 + +typedef enum { + MESSAGE_ENGINE_SPEED, + MESSAGE_WHEEL_TICK, + MESSAGE_FUEL_LEVEL, + MESSAGE_VEHICLE_SPEED, + NO_MESSAGE +} can_message_id_t; + +#endif diff --git a/src/vehicle-gateway/common.h b/src/vehicle-gateway/common.h index bd9be21..cfc8041 100644 --- a/src/vehicle-gateway/common.h +++ b/src/vehicle-gateway/common.h @@ -19,6 +19,11 @@ #define INCLUDE_COMMON #include <inttypes.h> +#define CR '\r' +#define CR_LF "\r\n" +#define EOS '\0' +#define SPACE ' ' + uint64_t get_timestamp(); #endif diff --git a/src/vehicle-gateway/obd2.cpp b/src/vehicle-gateway/obd2.cpp index 3734bc1..d9dfe96 100644 --- a/src/vehicle-gateway/obd2.cpp +++ b/src/vehicle-gateway/obd2.cpp @@ -45,6 +45,7 @@ #include <obd2.h> #include <common.h> +#include <can.h> /* baudrate settings are defined in <asm/termbits.h>, which is included by <termios.h> */ @@ -53,10 +54,10 @@ included by <termios.h> */ #define OBD_HEADER_LENGTH 5 //41 0C for instance -#define OBD_FUEL_TANK_PID "012F\r\n" -#define OBD_FUEL_TANK_MESSAGE_HEADER "41 2F" -#define OBD_FUEL_TANK_MESSAGE_DATA_LENGTH 1 -#define OBD_FUEL_TANK_MESSAGE_LENGTH OBD_HEADER_LENGTH+3*OBD_FUEL_TANK_MESSAGE_DATA_LENGTH //41 2F 00 +#define OBD_FUEL_LEVEL_PID "012F\r\n" +#define OBD_FUEL_LEVEL_MESSAGE_HEADER "41 2F" +#define OBD_FUEL_LEVEL_MESSAGE_DATA_LENGTH 1 +#define OBD_FUEL_LEVEL_MESSAGE_LENGTH OBD_HEADER_LENGTH+3*OBD_FUEL_LEVEL_MESSAGE_DATA_LENGTH //41 2F 00 #define OBD_RPM_PID "010C\r\n" #define OBD_RPM_MESSAGE_HEADER "41 0C" @@ -79,10 +80,6 @@ included by <termios.h> */ #define ELM_SET_CAN_ID_FILTER "AT CF" #define ELM_SET_CAN_ID_FILTER_LENGTH 12 -#define CR '\r' -#define CR_LF "\r\n" -#define EOS '\0' -#define SPACE ' ' #define BUFFER_MAX_LENGTH 512 @@ -143,7 +140,7 @@ int obd2_open_device(char* obd2_device, unsigned int baudrate) newtio.c_cc[VKILL] = 0; /* @ */ newtio.c_cc[VEOF] = 4; /* Ctrl-d */ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ - newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */ + newtio.c_cc[VMIN] = 0; /* non blocking read */ newtio.c_cc[VSWTC] = 0; /* '\0' */ newtio.c_cc[VSTART] = 0; /* Ctrl-q */ newtio.c_cc[VSTOP] = 0; /* Ctrl-s */ @@ -164,9 +161,10 @@ int obd2_open_device(char* obd2_device, unsigned int baudrate) return fd; } -bool obd2_read_answer(char*& ans,size_t& length,uint64_t& timestamp) -{ //ans is allocated dynamically +bool obd2_read(char*& data,size_t& length,uint64_t& timestamp) +{ //data is allocated dynamically bool isRead=false; + bool isBufferOverflow=false; char buf=EOS; ssize_t read_result; size_t buf_length=0; @@ -183,18 +181,20 @@ bool obd2_read_answer(char*& ans,size_t& length,uint64_t& timestamp) if(buf_length>BUFFER_MAX_LENGTH) { printf("%s\n","buffer overflow"); + isBufferOverflow=true; + delete tmp; //free the buffer break; }else{ if(buf==ELM_PROMPT){ isRead=true; *(tmp+buf_length)=buf; - ans = tmp; + data = tmp; //copy the pointer, so it'll be freed into the caller length=buf_length; } else{ if(buf==CR) buf=SPACE; - *(tmp+buf_length)=buf; + *(tmp+buf_length)=buf; //push back char } buf_length++; } @@ -202,7 +202,7 @@ bool obd2_read_answer(char*& ans,size_t& length,uint64_t& timestamp) } usleep(ELM_READ_LOOP); timeout+=ELM_READ_LOOP; - }while((isRead==false)&&(timeout<ELM_READ_TIMEOUT)); + }while((isRead==false)&&(timeout<ELM_READ_TIMEOUT)&&(isBufferOverflow==false)); timestamp=get_timestamp(); return isRead; @@ -235,8 +235,10 @@ bool obd2_reset(uint64_t& timestamp) size_t answer_length; if (obd2_send_command(ELM_RESET_ALL)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; + }else{ + delete answer; } }else{ return false; @@ -250,47 +252,20 @@ bool obd2_config(uint64_t& timestamp) size_t answer_length; if (obd2_send_command(ELM_ECHO_OFF)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; + }else{ + delete answer; } }else{ return false; } if (obd2_send_command(OBD_GET_PID_LIST)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ - return false; - } - }else{ - return false; - } - return true; -} - -bool obd2_config_can_reader(uint64_t& timestamp) -{ - char* answer; - size_t answer_length; - if (obd2_send_command(ELM_HEADER_ON)){ - answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ - return false; - } - }else{ - return false; - } - if (obd2_send_command(ELM_CAN_FORMAT_OFF)){ - answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ - return false; - } - }else{ - return false; - } - if (obd2_send_command(ELM_MONITOR_ALL)){ - answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; + }else{ + delete answer; } }else{ return false; @@ -307,18 +282,20 @@ bool obd2_read_engine_rpm(uint16_t& rpm,uint64_t& timestamp) size_t answer_length; if (obd2_send_command(OBD_RPM_PID)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; } }else{ return false; } if(answer_length!=OBD_RPM_MESSAGE_LENGTH){ + delete answer; return false; }else{ strncpy(header,answer,OBD_HEADER_LENGTH); header[OBD_HEADER_LENGTH]=EOS; if(strcmp(header,OBD_RPM_MESSAGE_HEADER)!=0){ + delete answer; return false; }else{ value[0]=answer[OBD_HEADER_LENGTH+1]; @@ -327,53 +304,47 @@ bool obd2_read_engine_rpm(uint16_t& rpm,uint64_t& timestamp) value[3]=answer[OBD_HEADER_LENGTH+5]; value[4]=EOS; rpm=atoi(value)/4; + delete answer; } } return true; } -bool can_read_engine_rpm(uint16_t& rpm,uint64_t& timestamp) -{ - return false; -} - -bool obd2_read_fuel_tank_level(uint8_t& level,uint64_t& timestamp) +bool obd2_read_fuel_level(uint8_t& level,uint64_t& timestamp) { //`012F` Fuel Tank Level Input: returns 1 byte: level in % char* answer; char header[OBD_HEADER_LENGTH+1]; - char value[OBD_FUEL_TANK_MESSAGE_DATA_LENGTH*2+1]; + char value[OBD_FUEL_LEVEL_MESSAGE_DATA_LENGTH*2+1]; size_t answer_length; - if (obd2_send_command(OBD_FUEL_TANK_PID)){ + if (obd2_send_command(OBD_FUEL_LEVEL_PID)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; } }else{ return false; } - if(answer_length!=OBD_FUEL_TANK_MESSAGE_LENGTH){ + if(answer_length!=OBD_FUEL_LEVEL_MESSAGE_LENGTH){ + delete answer; return false; }else{ strncpy(header,answer,OBD_HEADER_LENGTH); header[OBD_HEADER_LENGTH]=EOS; - if(strcmp(header,OBD_FUEL_TANK_MESSAGE_HEADER)!=0){ + if(strcmp(header,OBD_FUEL_LEVEL_MESSAGE_HEADER)!=0){ + delete answer; return false; }else{ value[0]=answer[OBD_HEADER_LENGTH+1]; value[1]=answer[OBD_HEADER_LENGTH+2]; value[3]=EOS; level=atoi(value); + delete answer; } } return true; } -bool can_read_fuel_tank_level(uint8_t& level,uint64_t& timestamp) -{ - return false; -} - bool obd2_set_filter(uint16_t filter,uint16_t mask,uint64_t& timestamp) { char* answer; @@ -386,19 +357,123 @@ bool obd2_set_filter(uint16_t filter,uint16_t mask,uint64_t& timestamp) if (obd2_send_command(filterBuffer)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; + }else{ + delete answer; } }else{ return false; } if (obd2_send_command(maskBuffer)){ answer=NULL; - if(obd2_read_answer(answer,answer_length,timestamp)!=true){ + if(obd2_read(answer,answer_length,timestamp)!=true){ + return false; + }else{ + delete answer; + } + }else{ + return false; + } + return true; +} + +bool obd2_config_can_reader(uint64_t& timestamp) +{ + char* answer; + size_t answer_length; + if (obd2_send_command(ELM_HEADER_ON)){ + answer=NULL; + if(obd2_read(answer,answer_length,timestamp)!=true){ + return false; + }else{ + delete answer; + } + }else{ + return false; + } + if (obd2_send_command(ELM_CAN_FORMAT_OFF)){ + answer=NULL; + if(obd2_read(answer,answer_length,timestamp)!=true){ + return false; + }else{ + delete answer; + } + }else{ + return false; + } + if (obd2_send_command(ELM_MONITOR_ALL)){ + answer=NULL; + if(obd2_read(answer,answer_length,timestamp)!=true){ return false; + }else{ + delete answer; } }else{ return false; } return true; } + +can_message_id_t can_read(char*& data,uint64_t& timestamp) +{ + bool isRead=false; + bool isBufferOverflow=false; + can_message_id_t ret=NO_MESSAGE; + char buf=EOS; + ssize_t read_result; + size_t buf_length=0; + useconds_t timeout=0; + char* tmp = new char[BUFFER_MAX_LENGTH]; + do{ + read_result=read(g_obd2_fd,&buf,1); + if(read_result==(-1)) + isRead=false; + else{ + if(read_result>0) + { + timeout=0; //data received so reset the time out + if(buf_length>BUFFER_MAX_LENGTH) + { + printf("%s\n","buffer overflow"); + isBufferOverflow=true; + delete tmp; //free the buffer + break; + }else{ + if(buf==CR){ + isRead=true; + *(tmp+buf_length)=EOS; + timestamp=get_timestamp(); + // analyze content now + if (strncmp(tmp,CAN_MESSAGE_ENGINE_SPEED_ID_AND_DATA_SIZE,CAN_ID_AND_DATA_SIZE_LENGTH)==0) + { + data=tmp; //copy the pointer, so it'll be freed into the caller + ret=MESSAGE_ENGINE_SPEED; + }else{ + if (strncmp(tmp,CAN_MESSAGE_FUEL_LEVEL_ID_AND_DATA_SIZE,CAN_ID_AND_DATA_SIZE_LENGTH)==0) + { + data=tmp; //copy the pointer, so it'll be freed into the caller + ret=MESSAGE_FUEL_LEVEL; + }else{ + if (strncmp(tmp,CAN_MESSAGE_WHEEL_TICK_ID_AND_DATA_SIZE,CAN_ID_AND_DATA_SIZE_LENGTH)==0) + { + data=tmp; //copy the pointer, so it'll be freed into the caller + ret=MESSAGE_WHEEL_TICK; + }else{ + delete tmp; //free the buffer + } + } + } + }else{ + *(tmp+buf_length)=buf; //push back char + } + buf_length++; + } + } + } + usleep(ELM_READ_LOOP); + timeout+=ELM_READ_LOOP; + }while((isRead==false)&&(timeout<ELM_READ_TIMEOUT)&&(isBufferOverflow==false)); + return ret; +} + diff --git a/src/vehicle-gateway/obd2.h b/src/vehicle-gateway/obd2.h index b3cd5e0..871e68a 100644 --- a/src/vehicle-gateway/obd2.h +++ b/src/vehicle-gateway/obd2.h @@ -42,6 +42,7 @@ extern "C" { #include <stdint.h> #include <math.h> #include <sys/types.h> +#include <can.h> bool obd2_init(char* obd2_device, unsigned int baudrate); @@ -51,16 +52,14 @@ bool obd2_config(uint64_t& timestamp); bool obd2_read_engine_rpm(uint16_t& rpm, uint64_t ×tamp); -bool can_read_engine_rpm(uint16_t& rpm, uint64_t ×tamp); - -bool obd2_read_fuel_tank_level(uint8_t& level,uint64_t& timestamp); - -bool can_read_fuel_tank_level(uint8_t& level,uint64_t& timestamp); +bool obd2_read_fuel_level(uint8_t& level,uint64_t& timestamp); bool obd2_config_can_reader(uint64_t& timestamp); bool obd2_set_filter(uint16_t filter, uint16_t mask, uint64_t& timestamp); +can_message_id_t can_read(char*& data, uint64_t ×tamp); + #ifdef __cplusplus } #endif diff --git a/src/vehicle-gateway/veh-gateway.cpp b/src/vehicle-gateway/veh-gateway.cpp index 4a6b0bd..5956495 100644 --- a/src/vehicle-gateway/veh-gateway.cpp +++ b/src/vehicle-gateway/veh-gateway.cpp @@ -31,18 +31,20 @@ #include <pthread.h> #include <semaphore.h> #include <termios.h> +#include <iostream> #include <common.h> #include <obd2.h> #include <gnss.h> +#include <can.h> #include <log.h> #define MSGIDLEN 20 #define BUFLEN 256 -#define PORT1 9930 //port used for GNSS data -#define PORT2 9931 //port used for sensor data -#define PORT3 9932 //port used for vehicle data +#define PORT_GNSS 9930 //port used for GNSS data +#define PORT_SENSOR 9931 //port used for sensor data +#define PORT_VEHICLE 9932 //port used for vehicle data const char * IPADDR_DEFAULT = "127.0.0.1"; #define SCAN_LOOP_TIME 100000 //100 ms @@ -62,9 +64,6 @@ const char * IPADDR_DEFAULT = "127.0.0.1"; #define NMEA_SOUTH "S" #define BAUDRATE_GNSS B38400 -#define CAN_MESSAGE_FILTER 0x123 -#define CAN_MESSAGE_MASK 0x7FF - typedef struct { double latitude; @@ -74,8 +73,7 @@ typedef struct DLT_DECLARE_CONTEXT(gContext); -bool isRunning=true; -bool can_reader_mode; +static bool isRunning=true; static int g_obd2_fd = -1; static struct termios g_oldtio; @@ -137,22 +135,15 @@ bool get_geolocation(char*& sock_buf,char* buffer,const uint64_t timestamp) return retval; } -bool get_engine_speed(char*& sock_buf) +bool get_obd_engine_speed(char*& sock_buf) { uint16_t rpm; uint64_t timestamp; char* tmp = new char[BUFLEN]; - if(can_reader_mode){ - if (can_read_engine_rpm(rpm,timestamp)!=true){ - LOG_ERROR_MSG(gContext,"Read engine rpm failed"); - return false; - } - }else{ - if (obd2_read_engine_rpm(rpm,timestamp)!=true){ - LOG_ERROR_MSG(gContext,"Read engine rpm failed"); - return false; - } + if (obd2_read_engine_rpm(rpm,timestamp)!=true){ + LOG_ERROR_MSG(gContext,"Read engine rpm failed"); + return false; } LOG_DEBUG(gContext,"Engine speed: %d",rpm); @@ -164,25 +155,18 @@ bool get_engine_speed(char*& sock_buf) return true; } -bool get_fuel_tank_level(char*& sock_buf) +bool get_obd_fuel_level(char*& sock_buf) { uint8_t fuel_level; uint64_t timestamp; char* tmp = new char[BUFLEN]; - if(can_reader_mode){ - if (can_read_fuel_tank_level(fuel_level,timestamp)!=true){ - LOG_ERROR_MSG(gContext,"Read fuel tank level failed"); - return false; - } - }else{ - if (obd2_read_fuel_tank_level(fuel_level,timestamp)!=true){ - LOG_ERROR_MSG(gContext,"Read fuel tank level failed"); - return false; - } + if (obd2_read_fuel_level(fuel_level,timestamp)!=true){ + LOG_ERROR_MSG(gContext,"Read fuel tank level failed"); + return false; } - LOG_DEBUG(gContext,"Fuel tank level: %d\%",fuel_level); + LOG_DEBUG(gContext,"Fuel tank level: %d",fuel_level); //compose frame data: TIMESTAMP,0$GVVEHFUELLEVEL,TIMESTAMP,LEVEL,0X01 sprintf(tmp,"%d,%s,%d,%d,0x01",timestamp,"0$GVVEHFUELLEVEL",timestamp,fuel_level); @@ -191,12 +175,16 @@ bool get_fuel_tank_level(char*& sock_buf) return true; } -bool get_vehicle_speed(char*& sock_buf) +bool get_obd_vehicle_speed(char*& sock_buf) +{ + return false; +} + +bool get_obd_wheel_tick(char*& sock_buf) { return false; } -//GVVEHFUELLEVEL //GVVEHFUELCONS //GVVEHTOTALODO @@ -212,20 +200,32 @@ int main(int argc, char* argv[]) struct sockaddr_in si_other; socklen_t slen = sizeof(si_other); int sock; - char* sock_buf; char * ipaddr = 0; // OBD and GNSS devices bool result; - uint64_t start, stop; + uint64_t start, stop, timestamp; char * modem_device_obd2 = 0; char * modem_device_gnss = 0; char gnss_buf[MAX_GNSS_BUFFER_SIZE]; uint64_t gnss_timestamp; + // CAN reader + bool can_reader_mode; + can_message_id_t can_message_id=NO_MESSAGE; + int can_message_data_size; + // default arguments can_reader_mode=false; ipaddr = (char*)IPADDR_DEFAULT; + + // DLT init and start banner + DLT_REGISTER_APP("GTWY", "VEH-GATEWAY"); + DLT_REGISTER_CONTEXT(gContext,"EMBD", "Global Context"); + + LOG_INFO_MSG(gContext,"------------------------------------------------"); + LOG_INFO_MSG(gContext,"VEH GATEWAY STARTED"); + LOG_INFO_MSG(gContext,"------------------------------------------------"); // arguments check if(argc < 3) { @@ -247,14 +247,8 @@ int main(int argc, char* argv[]) } } + LOG_INFO(gContext,"CAN reader mode set to: %d",can_reader_mode); - // DLT init and start banner - DLT_REGISTER_APP("GTWY", "VEH-GATEWAY"); - DLT_REGISTER_CONTEXT(gContext,"EMBD", "Global Context"); - - LOG_INFO_MSG(gContext,"------------------------------------------------"); - LOG_INFO_MSG(gContext,"VEH GATEWAY STARTED"); - LOG_INFO_MSG(gContext,"------------------------------------------------"); // socket initialization signal(SIGTERM, sighandler); @@ -317,19 +311,19 @@ int main(int argc, char* argv[]) // can reader mode start = get_timestamp(); if(!obd2_config_can_reader(stop)){ - LOG_DEBUG(gContext,"ECHO OFF OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); + LOG_DEBUG(gContext,"CAN READER MODE OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); return(-1); } start = get_timestamp(); if(!obd2_set_filter(CAN_MESSAGE_FILTER,CAN_MESSAGE_MASK,stop)){ - LOG_DEBUG(gContext,"ECHO OFF OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); + LOG_DEBUG(gContext,"SET FILTER OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); return(-1); } }else{ // config standard OBD2 with AT command start = get_timestamp(); if(!obd2_config(stop)){ - LOG_DEBUG(gContext,"ECHO OFF OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); + LOG_DEBUG(gContext,"STANDARD MODE OBD2 FAILURE [DURATION = %" PRIu64 " ms]", stop-start); return(-1); } } @@ -338,7 +332,7 @@ int main(int argc, char* argv[]) //main loop do{ - + char* sock_buf; //GNSS: list of supported message IDs //char* gnssstr = "GVGNSP,GVGNSC,GVGNSAC,GVGNSSAT"; //for the moment only GVGNSP is managed @@ -351,11 +345,11 @@ int main(int argc, char* argv[]) pthread_mutex_unlock(&mutex_gnss); /* up semaphore */ if(get_geolocation(sock_buf,gnss_buf,gnss_timestamp)) { - LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT1); + LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT_GNSS); LOG_DEBUG(gContext,"Len:%d", (int)strlen(sock_buf)); LOG_DEBUG(gContext,"Data:%s", sock_buf); - si_other.sin_port = htons(PORT1); + si_other.sin_port = htons(PORT_GNSS); if(sendto(sock, sock_buf, strlen(sock_buf)+1, 0, (struct sockaddr *)&si_other, slen) == -1) { LOG_ERROR_MSG(gContext,"sendto() failed!"); @@ -366,51 +360,130 @@ int main(int argc, char* argv[]) pthread_mutex_unlock(&mutex_gnss); /* up semaphore */ } + if(can_reader_mode) + { + char* can_message; + can_message_id=can_read(can_message,timestamp); + can_message_data_size=0; + if(can_message_id!=NO_MESSAGE) + sock_buf = new char[BUFLEN]; + uint16_t engine_speed; + uint8_t fuel_level; + uint16_t rear_left, rear_right; + char dump[CAN_MESSAGE_MAX_DATA_LENGTH*2]; + switch (can_message_id) { + //SNS: list of supported message IDs + //char* snsstr = "GVVEHSP,GVGYRO,GVGYROCONF,GVDRVDIR,GVODO,GVWHTK,GVWHTKCONF"; + //char* snsstr = "GVSNSVEHSP,GVSNSGYRO,GVSNSWHTK"; //subset currently supported for new log format + //for the moment no ID managed + //VHL: list of supported message IDs + //char* vhlstr = "GVVEHVER,GVVEHENGSPEED,GVVEHFUELLEVEL,GVVEHFUELCONS,GVVEHTOTALODO"; + //for the moment GVVEHENGSPEED, GVVEHFUELLEVEL managed + case MESSAGE_WHEEL_TICK: + strncpy(dump,can_message+CAN_MESSAGE_RL_WHEEL_TICK_INDEX,CAN_MESSAGE_WHEEL_TICK_FORMAT); + dump[CAN_MESSAGE_WHEEL_TICK_FORMAT]=EOS; + can_message_data_size=sscanf(dump,"%"SCNx16,&rear_left); + //todo manage error bit + strncpy(dump,can_message+CAN_MESSAGE_RR_WHEEL_TICK_INDEX,CAN_MESSAGE_WHEEL_TICK_FORMAT); + dump[CAN_MESSAGE_WHEEL_TICK_FORMAT]=EOS; + can_message_data_size=sscanf(dump,"%"SCNx16,&rear_right); + //todo manage error bit + //compose frame data: TIMESTAMP,0$GVSNSWHE,TIMESTAMP,RR,RL,0,0,0,0,0,statusBits,measurementInterval,0X03 + sprintf(sock_buf,"%d,%s,%d,%f,%f,0,0,0,0,0,0,0,0,0x01",timestamp,"0$GVSNSWHE",timestamp,(float)rear_left,(float)rear_right); + break; + case MESSAGE_ENGINE_SPEED: + strncpy(dump,can_message+CAN_MESSAGE_ENGINE_SPEED_INDEX,CAN_MESSAGE_ENGINE_SPEED_FORMAT); + dump[CAN_MESSAGE_ENGINE_SPEED_FORMAT]=EOS; + can_message_data_size=sscanf(dump,"%"SCNx16,&engine_speed); + engine_speed >>=3; + LOG_DEBUG(gContext,"Engine speed: %d RPM",engine_speed); + + //compose frame data: TIMESTAMP,0$GVVEHENGSPEED,TIMESTAMP,RPM,0X01 + sprintf(sock_buf,"%d,%s,%d,%d,0x01",timestamp,"0$GVVEHENGSPEED",timestamp,engine_speed); + break; + case MESSAGE_FUEL_LEVEL: + strncpy(dump,can_message+CAN_MESSAGE_FUEL_LEVEL_INDEX,CAN_MESSAGE_FUEL_LEVEL_FORMAT); + dump[CAN_MESSAGE_FUEL_LEVEL_FORMAT]=EOS; + can_message_data_size=sscanf(dump,"%"SCNx8,&fuel_level); + fuel_level >>=1; + LOG_DEBUG(gContext,"Fuel level: %d L",fuel_level); + + //compose frame data: TIMESTAMP,0$GVVEHFUELLEVEL,TIMESTAMP,LEVEL,0X01 + sprintf(sock_buf,"%d,%s,%d,%d,0x01",timestamp,"0$GVVEHFUELLEVEL",timestamp,fuel_level); + break; + break; + default: + break; + } + if(can_message_id!=NO_MESSAGE) + delete can_message; + } + //SNS: list of supported message IDs //char* snsstr = "GVVEHSP,GVGYRO,GVGYROCONF,GVDRVDIR,GVODO,GVWHTK,GVWHTKCONF"; //char* snsstr = "GVSNSVEHSP,GVSNSGYRO,GVSNSWHTK"; //subset currently supported for new log format //for the moment no ID managed - if(get_vehicle_speed(sock_buf)){ - LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT2); + if((!can_reader_mode && get_obd_vehicle_speed(sock_buf)) || (can_message_id==MESSAGE_VEHICLE_SPEED)){ + LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT_SENSOR); + LOG_DEBUG(gContext,"Len:%d", (int)strlen(sock_buf)); + LOG_DEBUG(gContext,"Data:%s", sock_buf); + + si_other.sin_port = htons(PORT_SENSOR); + if(sendto(sock, sock_buf, strlen(sock_buf)+1, 0, (struct sockaddr *)&si_other, slen) == -1) + { + LOG_ERROR_MSG(gContext,"sendto() failed!"); + delete sock_buf; + return EXIT_FAILURE; + } + delete sock_buf; + } + if((!can_reader_mode && get_obd_wheel_tick(sock_buf)) || (can_message_id==MESSAGE_WHEEL_TICK)){ + LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT_SENSOR); LOG_DEBUG(gContext,"Len:%d", (int)strlen(sock_buf)); LOG_DEBUG(gContext,"Data:%s", sock_buf); - si_other.sin_port = htons(PORT2); + si_other.sin_port = htons(PORT_SENSOR); if(sendto(sock, sock_buf, strlen(sock_buf)+1, 0, (struct sockaddr *)&si_other, slen) == -1) { LOG_ERROR_MSG(gContext,"sendto() failed!"); + delete sock_buf; return EXIT_FAILURE; } + delete sock_buf; } //VHL: list of supported message IDs //char* vhlstr = "GVVEHVER,GVVEHENGSPEED,GVVEHFUELLEVEL,GVVEHFUELCONS,GVVEHTOTALODO"; //for the moment GVVEHENGSPEED, GVVEHFUELLEVEL managed - if(get_engine_speed(sock_buf)) + if((!can_reader_mode && get_obd_engine_speed(sock_buf)) || (can_message_id==MESSAGE_ENGINE_SPEED)) { - LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT3); + LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT_VEHICLE); LOG_DEBUG(gContext,"Len:%d", (int)strlen(sock_buf)); LOG_DEBUG(gContext,"Data:%s", sock_buf); - si_other.sin_port = htons(PORT3); + si_other.sin_port = htons(PORT_VEHICLE); if(sendto(sock, sock_buf, strlen(sock_buf)+1, 0, (struct sockaddr *)&si_other, slen) == -1) { LOG_ERROR_MSG(gContext,"sendto() failed!"); + delete sock_buf; return EXIT_FAILURE; } + delete sock_buf; } - if(get_fuel_tank_level(sock_buf)) + if((!can_reader_mode && get_obd_fuel_level(sock_buf)) || (can_message_id==MESSAGE_FUEL_LEVEL)) { - LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT3); + LOG_DEBUG(gContext,"Sending Packet to %s:%d",ipaddr,PORT_VEHICLE); LOG_DEBUG(gContext,"Len:%d", (int)strlen(sock_buf)); LOG_DEBUG(gContext,"Data:%s", sock_buf); - si_other.sin_port = htons(PORT3); + si_other.sin_port = htons(PORT_VEHICLE); if(sendto(sock, sock_buf, strlen(sock_buf)+1, 0, (struct sockaddr *)&si_other, slen) == -1) { LOG_ERROR_MSG(gContext,"sendto() failed!"); + delete sock_buf; return EXIT_FAILURE; } + delete sock_buf; } usleep(SCAN_LOOP_TIME); diff --git a/test/script/dashboard.bmp b/test/script/dashboard.bmp Binary files differnew file mode 100644 index 0000000..01540f1 --- /dev/null +++ b/test/script/dashboard.bmp |