added checksum to auto-generated files
This commit is contained in:
@@ -2,6 +2,9 @@ import os
|
||||
import time
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
import json
|
||||
import sys
|
||||
|
||||
import filechecksum as fcs
|
||||
|
||||
def build_dtcs():
|
||||
# Pfad zur Eingabedatei und Ausgabedatei
|
||||
@@ -81,47 +84,62 @@ def build_dtcs():
|
||||
# Sortieren der Zeilen nach der Nummer aufsteigend
|
||||
dtc_lines.sort(key=lambda x: x[0])
|
||||
|
||||
# DTC_NAME_CONSTANT-Makros initialisieren
|
||||
dtc_macros = []
|
||||
dtc_structs = []
|
||||
dtc_table_data = []
|
||||
|
||||
# Verarbeiten der sortierten Zeilen
|
||||
for i, line in enumerate(dtc_lines):
|
||||
num, dtc_name, dtc_severity, title, description = line
|
||||
dtc_macros.append(f"#define {dtc_name:<30} {num}")
|
||||
comma = "," if i < len(dtc_lines) - 1 else " "
|
||||
dtc_structs.append(f" {{ {dtc_name:<30}, {dtc_severity:<12} }}{comma} // {description}")
|
||||
dtc_table_data.append({"num": num, "title": title, "description": description})
|
||||
|
||||
# Unix-Zeitstempel hinzufügen
|
||||
checksum = fcs.calculate_checksum(dtc_lines)
|
||||
timestamp = int(time.time())
|
||||
|
||||
env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8'))
|
||||
# Lade das Jinja2-Template aus der Datei
|
||||
template = env.get_template('dtc_defs.h.j2')
|
||||
if fcs.read_and_compare_checksum(output_file, checksum):
|
||||
print("Keine Änderungen im DTC-Headerfile erforderlich.")
|
||||
else:
|
||||
# DTC_NAME_CONSTANT-Makros initialisieren
|
||||
dtc_macros = []
|
||||
dtc_structs = []
|
||||
|
||||
# Erstelle ein Context-Dictionary mit den erforderlichen Daten
|
||||
context = {
|
||||
'timestamp_unix': timestamp,
|
||||
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)),
|
||||
'date' : time.strftime('%d.%m.%Y', time.localtime(timestamp)),
|
||||
'dtc_macros': dtc_macros, # Übergebe die dtc_macros-Liste direkt
|
||||
'dtc_structs': dtc_structs, # Übergebe die dtc_structs-Liste direkt
|
||||
}
|
||||
# Verarbeiten der sortierten Zeilen
|
||||
for i, line in enumerate(dtc_lines):
|
||||
num, dtc_name, dtc_severity, title, description = line
|
||||
dtc_macros.append(f"#define {dtc_name:<30} {num}")
|
||||
comma = "," if i < len(dtc_lines) - 1 else " "
|
||||
dtc_structs.append(f" {{ {dtc_name:<30}, {dtc_severity:<12} }}{comma} // {description}")
|
||||
|
||||
env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8'))
|
||||
# Lade das Jinja2-Template aus der Datei
|
||||
template = env.get_template('dtc_defs.h.j2')
|
||||
|
||||
# Erstelle ein Context-Dictionary mit den erforderlichen Daten
|
||||
context = {
|
||||
'timestamp_unix': timestamp,
|
||||
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)),
|
||||
'date' : time.strftime('%d.%m.%Y', time.localtime(timestamp)),
|
||||
'dtc_macros': dtc_macros, # Übergebe die dtc_macros-Liste direkt
|
||||
'dtc_structs': dtc_structs, # Übergebe die dtc_structs-Liste direkt
|
||||
'checksum' : checksum
|
||||
}
|
||||
|
||||
# Rendere das Template mit den Werten und erhalte den Header-Text
|
||||
header_text = template.render(context)
|
||||
# Rendere das Template mit den Werten und erhalte den Header-Text
|
||||
header_text = template.render(context)
|
||||
|
||||
# Schreibe den generierten Header-Text in die Header-Datei
|
||||
with open(output_file, "w", encoding='utf-8') as f:
|
||||
f.write(header_text)
|
||||
# Schreibe den generierten Header-Text in die Header-Datei
|
||||
with open(output_file, "w", encoding='utf-8') as f:
|
||||
f.write(header_text)
|
||||
|
||||
print(f"Header-Datei wurde erstellt: {output_file}")
|
||||
print(f"Header-Datei wurde erstellt: {output_file}")
|
||||
|
||||
# JSON-Datei mit UTF-8-Zeichencodierung erstellen
|
||||
with open(json_output_file, 'w', encoding='utf-8') as json_f:
|
||||
json.dump(dtc_table_data, json_f, ensure_ascii=False, indent=4, separators=(',', ': '))
|
||||
if fcs.read_and_compare_json_checksum(json_output_file, checksum):
|
||||
print("Keine Änderungen im DTC-JSON-file erforderlich.")
|
||||
else:
|
||||
dtc_info = {
|
||||
"codegenerator_checksum": checksum,
|
||||
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)),
|
||||
"dtc_table_data": []
|
||||
}
|
||||
|
||||
print(f"JSON-Datei wurde erstellt: {json_output_file}")
|
||||
|
||||
# Verarbeiten der sortierten Zeilen
|
||||
for i, line in enumerate(dtc_lines):
|
||||
num, dtc_name, dtc_severity, title, description = line
|
||||
dtc_info["dtc_table_data"].append({"num": num, "title": title, "description": description})
|
||||
|
||||
# JSON-Datei mit UTF-8-Zeichencodierung erstellen
|
||||
with open(json_output_file, 'w', encoding='utf-8') as json_f:
|
||||
json.dump(dtc_info, json_f, ensure_ascii=False, indent=4, separators=(',', ': '))
|
||||
|
||||
print(f"JSON-Datei wurde erstellt: {json_output_file}")
|
||||
|
45
Software/codegen/filechecksum.py
Normal file
45
Software/codegen/filechecksum.py
Normal file
@@ -0,0 +1,45 @@
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
|
||||
# Funktion zum Berechnen der SHA-256-Checksumme
|
||||
def calculate_checksum(data):
|
||||
sha256 = hashlib.sha256()
|
||||
sha256.update(str(data).encode('utf-8'))
|
||||
return sha256.hexdigest()
|
||||
|
||||
# Funktion zum Lesen und Vergleichen der Checksumme in einer Datei
|
||||
def read_and_compare_checksum(file_path, expected_checksum):
|
||||
try:
|
||||
with open(file_path, 'r') as file:
|
||||
content = file.read()
|
||||
# Suche nach der Zeile mit der Checksumme
|
||||
checksum_line_start = content.find("// CODEGENERATOR_CHECKSUM:")
|
||||
if checksum_line_start != -1:
|
||||
# Extrahiere die Checksumme aus der Zeile
|
||||
existing_checksum = content[checksum_line_start + len("// CODEGENERATOR_CHECKSUM:"):].strip()
|
||||
# Vergleiche die Checksummen
|
||||
if existing_checksum == expected_checksum:
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
pass # Datei existiert nicht, was nicht schlimm ist
|
||||
|
||||
return False
|
||||
|
||||
def read_and_compare_json_checksum(json_file_path, expected_checksum):
|
||||
try:
|
||||
with open(json_file_path, 'r') as json_file:
|
||||
# Lade das JSON aus der Datei
|
||||
data = json.load(json_file)
|
||||
|
||||
# Überprüfe, ob "codegenerator_checksum" im JSON vorhanden ist
|
||||
if "codegenerator_checksum" in data:
|
||||
existing_checksum = data["codegenerator_checksum"]
|
||||
|
||||
# Vergleiche die Checksummen
|
||||
if existing_checksum == expected_checksum:
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
pass # Datei existiert nicht, was nicht schlimm ist
|
||||
|
||||
return False
|
@@ -3,6 +3,8 @@ import time
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
import re
|
||||
|
||||
import filechecksum as fcs
|
||||
|
||||
# Pfad zur Eingabedatei und Ausgabedatei
|
||||
input_file = "include/config.h"
|
||||
output_sourcefile = "src/struct2json.cpp"
|
||||
@@ -67,6 +69,7 @@ def struct2json():
|
||||
|
||||
variable_types = get_types(content, variable_names)
|
||||
structs = extract_struct_fields(content, variable_types)
|
||||
checksum = fcs.calculate_checksum(structs)
|
||||
|
||||
env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8'))
|
||||
# Lade das Jinja2-Template aus der Datei
|
||||
@@ -78,16 +81,28 @@ def struct2json():
|
||||
'timestamp_unix': timestamp,
|
||||
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)),
|
||||
'date' : time.strftime('%d.%m.%Y', time.localtime(timestamp)),
|
||||
'structs': structs, # Übergebe die foo-Liste direkt
|
||||
'structs': structs,
|
||||
'checksum': checksum
|
||||
}
|
||||
|
||||
# Rendere das Template mit den Werten und erhalte den Source-Text
|
||||
source_text = template_c.render(context)
|
||||
header_text = template_h.render(context)
|
||||
# Überprüfe, ob die Checksummen übereinstimmen
|
||||
if fcs.read_and_compare_checksum(output_sourcefile, checksum):
|
||||
print("Keine Änderungen in der Source-Datei erforderlich.")
|
||||
else:
|
||||
# Rendere das Template mit den Werten und erhalte den Source-Text
|
||||
source_text = template_c.render(context)
|
||||
# Schreibe den generierten Source-Text in die Source-Datei
|
||||
with open(output_sourcefile, "w", encoding='utf-8') as f:
|
||||
f.write(source_text)
|
||||
print(f"Source-Datei wurde erstellt: {output_sourcefile}")
|
||||
|
||||
# Schreibe den generierten Source-Text in die Source-Dateien
|
||||
with open(output_sourcefile, "w", encoding='utf-8') as f:
|
||||
f.write(source_text)
|
||||
with open(output_headerfile, "w", encoding='utf-8') as f:
|
||||
f.write(header_text)
|
||||
print(f"Source-Dateien wurde erstellt: {output_sourcefile}, {output_headerfile}")
|
||||
# Überprüfe, ob die Checksummen übereinstimmen
|
||||
if fcs.read_and_compare_checksum(output_headerfile, checksum):
|
||||
print("Keine Änderungen in der Header-Datei erforderlich.")
|
||||
else:
|
||||
# Rendere das Template mit den Werten und erhalte den Header-Text
|
||||
header_text = template_h.render(context)
|
||||
# Schreibe den generierten Header-Text in die Header-Datei
|
||||
with open(output_headerfile, "w", encoding='utf-8') as f:
|
||||
f.write(header_text)
|
||||
print(f"Header-Datei wurde erstellt: {output_headerfile}")
|
@@ -49,6 +49,6 @@ const DTC_t dtc_definitions[] = {
|
||||
{% endfor -%}
|
||||
};
|
||||
|
||||
const uint32_t dtc_generation_timestamp = {{ timestamp_unix }};
|
||||
|
||||
#endif // DTC_DEFS_H
|
||||
|
||||
// CODEGENERATOR_CHECKSUM: {{ checksum }}
|
@@ -21,3 +21,5 @@ void generateJsonObject_{{ var_name }}(JsonObject& data)
|
||||
}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
// CODEGENERATOR_CHECKSUM: {{ checksum }}
|
@@ -21,4 +21,6 @@
|
||||
void generateJsonObject_{{ var_name }}(JsonObject& data);
|
||||
{% endfor %}
|
||||
|
||||
#endif /* _STRUCT2JSON_H_ */
|
||||
#endif /* _STRUCT2JSON_H_ */
|
||||
|
||||
// CODEGENERATOR_CHECKSUM: {{ checksum }}
|
Reference in New Issue
Block a user