Skip to content

Commit

Permalink
feat: function to get VIN Number added
Browse files Browse the repository at this point in the history
  • Loading branch information
AdonaiDiazEsparza committed Oct 22, 2024
1 parent f301025 commit c1a8d74
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 8 deletions.
Binary file modified Canbus_app/dist/canbus_app.fap
Binary file not shown.
Binary file modified Canbus_app/dist/debug/canbus_app_d.elf
Binary file not shown.
54 changes: 54 additions & 0 deletions Canbus_app/libraries/pid_library.c
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,60 @@ bool request_dtc(OBDII* obdii, uint8_t* count, char* codes[]) {
return true;
}

// Separate frames in arrays
void separate_VIN_data(CANFRAME frame, uint8_t* vin, uint8_t count) {
count = count * 7;

for(uint8_t i = 0; i < 7; i++) {
vin[i + count] = frame.buffer[i + 1];
}
}

// Get the CAR VIN
bool get_VIN(OBDII* obdii, FuriString* vin_number) {
CANFRAME canframes[5];

memset(canframes, 0, sizeof(canframes));

if(!pid_manual_request(obdii, 0x7df, REQUEST_VEHICLE_INFORMATION, 0x2, canframes, 5, 2))
return false;

if(canframes[0].buffer[2] != 0x49) return false;

uint32_t extension = canframes[0].buffer[1];

log_info("extension: %lu", extension);

uint8_t vin[40];

memset(vin, 0, sizeof(vin));

for(uint8_t i = 0; i < 5; i++) {
separate_VIN_data(canframes[i], vin, i);
}

char letters_vin[extension];

for(uint8_t i = 0; i < extension; i++) {
if(vin[i + 1] < 32) {
letters_vin[i] = ' ';
} else {
letters_vin[i] = vin[i + 1];
}
log_info("letter: %c number: %x", letters_vin[i], vin[i + 1]);
}

furi_string_reset(vin_number);

for(uint8_t i = 0; i < extension; i++) {
furi_string_cat_printf(vin_number, "%c", letters_vin[i]);
}

log_info("%s", furi_string_get_cstr(vin_number));

return true;
}

// It works to free
void pid_deinit(OBDII* obdii) {
free_mcp2515(obdii->CAN);
Expand Down
4 changes: 3 additions & 1 deletion Canbus_app/libraries/pid_library.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#ifndef PID_LIBRARY
#define PID_LIBRARY

#include "string.h"
#include "mcp_can_2515.h"

#define ECU_TYPICAL_ID_STANDAR 0x7E8
Expand Down Expand Up @@ -126,6 +125,9 @@ bool request_dtc(OBDII* obdii, uint8_t* count, char* codes[]);
// Clear DTC
bool clear_dtc(OBDII* obdii);

// Get VIN
bool get_VIN(OBDII* obdii, FuriString* String);

// Function to calculate the engine speed
uint16_t calculate_engine_speed(uint8_t value_a, uint8_t value_b);

Expand Down
74 changes: 67 additions & 7 deletions Canbus_app/scenes/Obd2MenuOption.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ static uint8_t count_of_bytes = 2;
// This variable works to know if it wishes to delete the DTC storage
static bool delete_dtc = false;

// These variable are used for the VIN and ECU Name request
static request_data = 0;

Check failure on line 26 in Canbus_app/scenes/Obd2MenuOption.c

View workflow job for this annotation

GitHub Actions / ufbt: Build for Dev branch

type defaults to 'int' in declaration of 'request_data' [-Werror=implicit-int]

Check failure on line 26 in Canbus_app/scenes/Obd2MenuOption.c

View workflow job for this annotation

GitHub Actions / ufbt: Build for Dev branch

'request_data' defined but not used [-Werror=unused-variable]

// odbii menu casllback
void obdii_menu_callback(void* context, uint32_t index) {
App* app = context;
Expand All @@ -38,14 +41,18 @@ void obdii_menu_callback(void* context, uint32_t index) {
break;

case 2:
scene_manager_next_scene(app->scene_manager, app_scene_obdii_get_errors_option);
scene_manager_next_scene(app->scene_manager, app_scene_car_data_option);
break;

case 3:
scene_manager_next_scene(app->scene_manager, app_scene_obdii_delete_errors_option);
scene_manager_next_scene(app->scene_manager, app_scene_obdii_get_errors_option);
break;

case 4:
scene_manager_next_scene(app->scene_manager, app_scene_obdii_delete_errors_option);
break;

case 5:
scene_manager_next_scene(app->scene_manager, app_scene_manual_sender_pid_option);
break;

Expand All @@ -64,9 +71,10 @@ void app_scene_obdii_menu_on_enter(void* context) {
// Examples
submenu_add_item(app->submenu, "Get Supported PID Codes", 0, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Show Typical Data", 1, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Show DTC", 2, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Delete DTC", 3, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Manual Sender PID", 4, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Get VIN number", 2, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Show DTC", 3, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Delete DTC", 4, obdii_menu_callback, app);
submenu_add_item(app->submenu, "Manual Sender PID", 5, obdii_menu_callback, app);

submenu_set_selected_item(app->submenu, app->obdii_aux_index);

Expand All @@ -92,6 +100,7 @@ static int32_t obdii_thread_on_work(void* context);
static int32_t obdii_thread_getting_pid_supported_on_work(void* context);
static int32_t obdii_thread_dtc_on_work(void* context);
static int32_t obdii_thread_response_manual_sender_on_work(void* context);
static int32_t obdii_get_car_data(void* context);

/*
Expand Down Expand Up @@ -406,6 +415,36 @@ void app_scene_list_supported_pid_on_exit(void* context) {
submenu_reset(app->submenu);
}

/*
Scene to get the VIN and ECU Name
*/
// Scene on enter
void app_scene_get_car_data_on_enter(void* context) {
App* app = context;
widget_reset(app->widget);

app->thread = furi_thread_alloc_ex("CarDatas", 1024, obdii_get_car_data, app);
furi_thread_start(app->thread);

view_dispatcher_switch_to_view(app->view_dispatcher, ViewWidget);
}

// Scene on event
bool app_scene_get_car_data_on_event(void* context, SceneManagerEvent event) {
UNUSED(context);
UNUSED(event);

return false;
}

// Scene on exit
void app_scene_get_car_data_on_exit(void* context) {
App* app = context;
furi_thread_join(app->thread);
furi_thread_free(app->thread);
widget_reset(app->widget);
}

/*
Scene to watch the errors in the car
*/
Expand Down Expand Up @@ -907,6 +946,8 @@ static int32_t obdii_thread_on_work(void* context) {
draw_scene(app, option, sum_value(data[3], data[4]));
break;

case 7:

default:
draw_in_development(app);
break;
Expand All @@ -917,8 +958,6 @@ static int32_t obdii_thread_on_work(void* context) {
}
}
pid_deinit(&scanner);

UNUSED(app);
return 0;
}

Expand Down Expand Up @@ -1130,3 +1169,24 @@ static int32_t obdii_thread_response_manual_sender_on_work(void* context) {

return 0;
}

/*
Thread to get the VIN number
*/

static int32_t obdii_get_car_data(void* context) {
App* app = context;
OBDII scanner;

scanner.bitrate = app->mcp_can->bitRate;

bool run = pid_init(&scanner);

if(run) {
get_VIN(&scanner, app->text);
}

pid_deinit(&scanner);

return 0;
}
1 change: 1 addition & 0 deletions Canbus_app/scenes_config/app_scene_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@ ADD_SCENE(app, obdii_delete_dtc, obdii_delete_errors_option)
ADD_SCENE(app, manual_sender_pid, manual_sender_pid_option)
ADD_SCENE(app, response_manual_pid, response_pid_option)
ADD_SCENE(app, input_manual_set_pid, input_manual_pid_option)
ADD_SCENE(app, get_car_data, car_data_option)

0 comments on commit c1a8d74

Please sign in to comment.