Code:
/************************************/
/* CAN Diagnosis system */
/* René van der Kooij */
/************************************/
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define choose_menu "Please enter a number:"
#define title_vehicle_make "Please enter the vehicle make: "
#define title_vehicle_model "Please enter the vehicle model: "
#define title_vehicle_year "Please enter the model year: "
#define title_vehicle_chassisnumber "Please enter the chassis number: "
#define title_vehicle_tester "Please enter the vehicle tester: "
#define title_test_location "Please enter the location of the test: "
#define title_general_info " General test information: [1/2]"
#define title_can_info " CAN information: [2/2]"
#define title_main_menu " MAIN MENU"
#define title_can_baudrate "Please enter the CAN baudrate: "
#define title_can_location "Please enter the location of the CAN connector: "
#define title_info_file "***** Test info file *****\n"
#define program_title "\n[ CAN Diagnosis ]"
#define break_line "------------------------------------"
#define main_menu1 "1. Start test procedure"
#define main_menu2 "2. Analyse data"
#define main_menu3 "3. Placeholder"
#define main_menu4 "4. Exit"
#define close_window "[ Press any key to close window ]"
#define invalid_entry "Invalid entry! Please try again"
#define source_file "Please enter the source filename:"
#define source_file_error "Can't open source file!"
#define destination_file "Please enter the destination filename:"
/****************************** Global Variables ******************************/
FILE *test_info, *CAN_data;
char info_filename[30], data_filename[30], year[30];
char vehicle_make[80], vehicle_model[80], vehicle_year[80], vehicle_chassisnumber[80], vehicle_tester[80], test_location[80], can_baudrate[80], can_location[80], length;
time_t now, rawtime;
bool exit_flag, error_flag=FALSE;
/***************************** Fullscreen function ****************************/
void full_screen(void)
{
keybd_event(VK_MENU,0x38,0,0);
keybd_event(VK_RETURN,0x1c,0,0);
keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);
}
// MS Windows only (?)
/************************ Function to clear the screen ************************/
void clrscr(void)
{
COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(hConsole, TEXT(' '),
dwConSize, coordScreen, &cCharsWritten);
GetConsoleScreenBufferInfo(hConsole, &csbi);
FillConsoleOutputAttribute(hConsole, csbi.wAttributes,
dwConSize, coordScreen, &cCharsWritten);
SetConsoleCursorPosition(hConsole, coordScreen);
}
// MS Windows only (?)
/**************************** Analyse data function ***************************/
int analyse_data(void)
{
FILE *fpin, *fpout;
char flin[256],flout[256];
int ih;
// clrscr(); //Clear screen, MS Windows only (?)
puts(program_title);
puts(break_line);
puts(source_file);
// fgets(flin, sizeof(flin), stdin);
scanf("%s",flin);
// flin[strlen(flin)-1]='\0'; // delete \n
if((fpin = fopen(flin, "rb"))== NULL)
{
puts(source_file_error);
getch();
return 0;
}
puts(destination_file);
scanf("%s",flout);
// fgets(flout, sizeof(flout), stdin);
fpout=fopen(flout,"wb");
while((ih=fgetc(fpin))!=EOF)
{
fputc(ih,fpout);
putch(ih);
}
fclose(fpin);
fclose(fpout);
return 0;
}
/*************************** Test procedure function **************************/
void test_procedure(void)
{
// clrscr(); //Clear screen, MS Windows only (?)
puts(program_title);
/* Time Function for display in log file and interface */
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
/*******************************************************/
/* Time function for filename definition */
now = time(NULL);
struct tm *t = localtime(&now);
/*****************************************/
/* Input request */
puts(break_line);
puts(title_general_info);
puts(break_line);
/* Vehicle make */
while(strlen(vehicle_make)<2)
{
puts(title_vehicle_make);
fgets(vehicle_make, 80, stdin);
if(strlen(vehicle_make)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
vehicle_make[ strcspn( vehicle_make, "\n" ) ] = '\0';
// vehicle_make[strlen(vehicle_make)-1]='\0'; // delete \n
/* Vehicle year */
while(strlen(vehicle_model)<2)
{
puts(title_vehicle_model);
fgets(vehicle_model, 80, stdin);
if(strlen(vehicle_model)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
vehicle_model[ strcspn( vehicle_model, "\n" ) ] = '\0';
// vehicle_model[strlen(vehicle_model)-1]='\0'; // delete \n
while(strlen(vehicle_year)<2)
{
puts(title_vehicle_year);
fgets(vehicle_year, 80, stdin);
if(strlen(vehicle_year)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
vehicle_year[ strcspn( vehicle_year, "\n" ) ] = '\0';
// vehicle_year[strlen(vehicle_year)-1]='\0'; // delete \n
/* Chassis number */
while(strlen(vehicle_chassisnumber)<2)
{
puts(title_vehicle_chassisnumber);
fgets(vehicle_chassisnumber, 80, stdin);
if(strlen(vehicle_chassisnumber)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
vehicle_chassisnumber[ strcspn( vehicle_chassisnumber, "\n" ) ] = '\0';
// vehicle_chassisnumber[strlen(vehicle_chassisnumber)-1]='\0'; // delete \n
/* Vehicle tester */
while(strlen(vehicle_tester)<2)
{
puts(title_vehicle_tester);
fgets(vehicle_tester, 80, stdin);
if(strlen(vehicle_tester)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
vehicle_tester[ strcspn( vehicle_tester, "\n" ) ] = '\0';
// vehicle_tester[strlen(vehicle_tester)-1]='\0'; // delete \n
/* Test location */
while(strlen(test_location)<2)
{
puts(title_test_location);
fgets(test_location, 80, stdin);
if(strlen(test_location)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
test_location[ strcspn( test_location, "\n" ) ] = '\0';
// test_location[strlen(test_location)-1]='\0'; // delete \n
// clrscr();//Clear screen
puts(program_title);
puts(break_line);
puts(title_can_info);
puts(break_line);
/* CAN baudrate */
while(strlen(can_baudrate)<2)
{
puts(title_can_baudrate);
fgets(can_baudrate, 80, stdin);
if(strlen(can_baudrate)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
can_baudrate[ strcspn( can_baudrate, "\n" ) ] = '\0';
// can_baudrate[strlen(can_baudrate)-1]='\0'; // delete \n
/* CAN location */
while(strlen(can_location)<2)
{
puts(title_can_location);
fgets(can_location, 80, stdin);
if(strlen(can_location)<2)
{
puts(invalid_entry);
// Sleep(500);
}
}
can_location[ strcspn( can_location, "\n" ) ] = '\0';
// can_location[strlen(can_location)-1]='\0'; // delete \n
puts(break_line);
strftime(info_filename, sizeof(info_filename), "i_%d%m%y_%H%M%S.txt", t);
strftime(data_filename, sizeof(data_filename), "d_%d%m%y_%H%M%S.txt", t);
// strftime(year, sizeof(year), "%Y", t);
/* Create test info file */
test_info = fopen(info_filename, "w");
fprintf(test_info, title_info_file);
fprintf(test_info, asctime (timeinfo));
fprintf(test_info, "\nmake: %s\nmodel: %s\nyear: %s\nchassis number: %s\ntester: %s\ntest location: %s\ncan baudrate: %s\ncan connector location: %s", vehicle_make, vehicle_model, vehicle_year, vehicle_chassisnumber, vehicle_tester, test_location, can_baudrate, can_location);
fclose(test_info);
printf("Info file (%s) created successfully!\n", info_filename);
/*************************/
// Sleep(1000); //Wait to display info file name
// clrscr(); //Clear screen, MS Windows only (?)
puts(program_title);
/* Create CAN data file */
CAN_data = fopen(data_filename, "w");
// fprintf(CAN_data, "This is the placeholder for CAN data extracted from the %s %s network", vehicle_make, vehicle_model);
/* Close CAN data file */
fclose(CAN_data);
printf("\nData file (%s) created successfully!\n", data_filename);
}
/*********************************** MAIN *************************************/
int main(void)
{
/* Define variables */
char buf[BUFSIZ];
int menu_switch=0;
/* Start full screen */
// full_screen();
/* One second pause to prevent double filenames */
// Sleep(1000);
// MS Windows only (?)
/* Start of actual program */
do
{
puts(program_title);
puts(break_line);
puts(title_main_menu);
puts(break_line);
/* Test menu */
puts(main_menu1);
puts(main_menu2);
puts(main_menu3);
puts(main_menu4);
puts(break_line);
puts(choose_menu);
/* Get user input for function selection */
if (fgets(buf, sizeof(buf), stdin) != NULL)
{
menu_switch = atoi(buf);
}
switch(menu_switch)
{
case 1:
exit_flag=1;
getch();
break;
case 2:
exit_flag=1;
puts("You chose 2");
analyse_data();
getch();
break;
case 3:
exit_flag=1;
puts("You chose 3");
getch();
break;
case 4:
exit_flag=0;
break;
default: exit_flag=0;
}
}
while(exit_flag);
puts(close_window);
getch();
return 0;
}
/******************************************************************************/