1 |
|
|
#include "csvutils.h" |
2 |
|
|
#include <stdio.h> |
3 |
|
|
#include <errno.h> |
4 |
|
|
#include <stdlib.h> |
5 |
|
|
#include <string.h> |
6 |
|
|
#include <stdbool.h> |
7 |
|
|
|
8 |
|
1 |
int writeCSV(const VehicleData* csvdata, int numEntries, const char* filename){ |
9 |
|
1 |
FILE* file = fopen(filename,"w"); //opens 'filename' and assigns to 'file' the pointer to that file; |
10 |
|
|
|
11 |
|
1 |
fprintf(file, "timestamp,velocity,angleAccPedal,angleBrakePedal,requestCarStart,voltage,current,currentMode,rpm,voltage,current\n"); //csv header |
12 |
✓✓ |
4 |
for(int i = 0; i < numEntries; i++){ |
13 |
|
|
char csvLine[512]; // Arbitrary size |
14 |
|
3 |
writeCSVLine(csvdata[i], csvLine); |
15 |
|
3 |
fprintf(file, "%s\n", csvLine); |
16 |
|
|
} |
17 |
|
|
|
18 |
|
1 |
fclose(file); |
19 |
|
1 |
return 0; |
20 |
|
|
} |
21 |
|
|
|
22 |
|
6 |
void writeCSVLine(const VehicleData data, char* csvLine){ |
23 |
|
6 |
sprintf(csvLine, "%u," // timeMillis |
24 |
|
|
"%hu," // vehicle.velocity |
25 |
|
|
"%hu," // vehicle.angleAccPedal |
26 |
|
|
"%hu," // vehicle.angleBrakePedal |
27 |
|
|
"%hu," // vehicle.requestCarStart |
28 |
|
|
"%hu," // battery.voltage |
29 |
|
|
"%hhd," // battery.current |
30 |
|
|
"%d," // bsg.currentMode |
31 |
|
|
"%hu," // bsg.rpm |
32 |
|
|
"%hu," // bsg.voltage |
33 |
|
|
"%hu," // bsg.current |
34 |
|
|
"%u," // engine.rpm |
35 |
|
|
"%hu," // engine.velocity |
36 |
|
|
"%hu", // engine.gear |
37 |
|
|
data.timeMillis, |
38 |
|
6 |
data.vehicle.velocity, |
39 |
|
6 |
data.vehicle.angleAccPedal, |
40 |
|
6 |
data.vehicle.angleBrakePedal, |
41 |
|
6 |
data.vehicle.requestCarStart, |
42 |
|
6 |
data.battery.voltage, |
43 |
|
6 |
data.battery.current, |
44 |
|
6 |
data.bsg.currentMode, |
45 |
|
6 |
data.bsg.rpm, |
46 |
|
6 |
data.bsg.voltage, |
47 |
|
6 |
data.bsg.current, |
48 |
|
6 |
data.engine.rpm, |
49 |
|
6 |
data.engine.velocity, |
50 |
|
6 |
data.engine.gear |
51 |
|
|
); |
52 |
|
6 |
} |
53 |
|
|
|
54 |
|
1 |
int readCSV(VehicleData* csvdata, int numEntries, const char* filename){ |
55 |
|
1 |
FILE* file = fopen(filename,"r"); //opens 'filename' and assigns to 'file' the pointer to that file; |
56 |
|
|
|
57 |
|
1 |
const int bufferSize = 512; |
58 |
|
1 |
char csvLine[bufferSize]; |
59 |
|
|
|
60 |
|
1 |
fgets(csvLine, bufferSize, file); // Drop First Line with header |
61 |
|
|
|
62 |
✓✓✓✗
|
4 |
for( int i = 0; ( i < numEntries ) && fgets(csvLine, 512, file); i++ ) { |
63 |
|
3 |
readCSVLine(&csvdata[i], csvLine); |
64 |
|
|
} |
65 |
|
1 |
fclose(file); |
66 |
|
1 |
return 0; |
67 |
|
|
} |
68 |
|
|
|
69 |
|
|
|
70 |
|
6 |
void readCSVLine(VehicleData* data, const char* csvLine){ |
71 |
|
6 |
sscanf(csvLine, "%u," // Timestamp |
72 |
|
|
"%hu," // vehicle.velocity |
73 |
|
|
"%hu," // vehicle.angleAccPedal |
74 |
|
|
"%hu," // vehicle.angleBrakePedal |
75 |
|
|
"%hhu," // vehicle.requestCarStart |
76 |
|
|
"%hhu," // battery.voltage |
77 |
|
|
"%hhd," // battery.current |
78 |
|
|
"%u," // bsg.currentMode |
79 |
|
|
"%hu," // bsg.rpm |
80 |
|
|
"%hu," // bsg.voltage |
81 |
|
|
"%hu," // bsg.current |
82 |
|
|
"%hu," // engine.rpm |
83 |
|
|
"%hhu," // engine.velocity |
84 |
|
|
"%hhu", // engine.gear |
85 |
|
|
&(data->timeMillis), |
86 |
|
|
&(data->vehicle.velocity), |
87 |
|
|
&(data->vehicle.angleAccPedal), |
88 |
|
|
&(data->vehicle.angleBrakePedal), |
89 |
|
|
&(data->vehicle.requestCarStart), |
90 |
|
|
&(data->battery.voltage), |
91 |
|
|
&(data->battery.current), |
92 |
|
|
&(data->bsg.currentMode), |
93 |
|
|
&(data->bsg.rpm), |
94 |
|
|
&(data->bsg.voltage), |
95 |
|
|
&(data->bsg.current), |
96 |
|
|
&(data->engine.rpm), |
97 |
|
|
&(data->engine.velocity), |
98 |
|
|
&(data->engine.gear) |
99 |
|
|
); |
100 |
|
6 |
} |