added checksum to auto-generated files

This commit is contained in:
Marcel Peterkau 2024-01-10 19:09:18 +01:00
parent 925167ec3c
commit 58c6bc820a
10 changed files with 241 additions and 150 deletions

View File

@ -2,6 +2,9 @@ import os
import time import time
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
import json import json
import sys
import filechecksum as fcs
def build_dtcs(): def build_dtcs():
# Pfad zur Eingabedatei und Ausgabedatei # Pfad zur Eingabedatei und Ausgabedatei
@ -81,47 +84,62 @@ def build_dtcs():
# Sortieren der Zeilen nach der Nummer aufsteigend # Sortieren der Zeilen nach der Nummer aufsteigend
dtc_lines.sort(key=lambda x: x[0]) dtc_lines.sort(key=lambda x: x[0])
# DTC_NAME_CONSTANT-Makros initialisieren checksum = fcs.calculate_checksum(dtc_lines)
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
timestamp = int(time.time()) timestamp = int(time.time())
env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8')) if fcs.read_and_compare_checksum(output_file, checksum):
# Lade das Jinja2-Template aus der Datei print("Keine Änderungen im DTC-Headerfile erforderlich.")
template = env.get_template('dtc_defs.h.j2') else:
# DTC_NAME_CONSTANT-Makros initialisieren
dtc_macros = []
dtc_structs = []
# Erstelle ein Context-Dictionary mit den erforderlichen Daten # Verarbeiten der sortierten Zeilen
context = { for i, line in enumerate(dtc_lines):
'timestamp_unix': timestamp, num, dtc_name, dtc_severity, title, description = line
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)), dtc_macros.append(f"#define {dtc_name:<30} {num}")
'date' : time.strftime('%d.%m.%Y', time.localtime(timestamp)), comma = "," if i < len(dtc_lines) - 1 else " "
'dtc_macros': dtc_macros, # Übergebe die dtc_macros-Liste direkt dtc_structs.append(f" {{ {dtc_name:<30}, {dtc_severity:<12} }}{comma} // {description}")
'dtc_structs': dtc_structs, # Übergebe die dtc_structs-Liste direkt
} 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 # Rendere das Template mit den Werten und erhalte den Header-Text
header_text = template.render(context) header_text = template.render(context)
# Schreibe den generierten Header-Text in die Header-Datei # Schreibe den generierten Header-Text in die Header-Datei
with open(output_file, "w", encoding='utf-8') as f: with open(output_file, "w", encoding='utf-8') as f:
f.write(header_text) 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 if fcs.read_and_compare_json_checksum(json_output_file, checksum):
with open(json_output_file, 'w', encoding='utf-8') as json_f: print("Keine Änderungen im DTC-JSON-file erforderlich.")
json.dump(dtc_table_data, json_f, ensure_ascii=False, indent=4, separators=(',', ': ')) 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}")

View 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

View File

@ -3,6 +3,8 @@ import time
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
import re import re
import filechecksum as fcs
# Pfad zur Eingabedatei und Ausgabedatei # Pfad zur Eingabedatei und Ausgabedatei
input_file = "include/config.h" input_file = "include/config.h"
output_sourcefile = "src/struct2json.cpp" output_sourcefile = "src/struct2json.cpp"
@ -67,6 +69,7 @@ def struct2json():
variable_types = get_types(content, variable_names) variable_types = get_types(content, variable_names)
structs = extract_struct_fields(content, variable_types) structs = extract_struct_fields(content, variable_types)
checksum = fcs.calculate_checksum(structs)
env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8')) env = Environment(loader=FileSystemLoader('codegen/templates', encoding='utf-8'))
# Lade das Jinja2-Template aus der Datei # Lade das Jinja2-Template aus der Datei
@ -78,16 +81,28 @@ def struct2json():
'timestamp_unix': timestamp, 'timestamp_unix': timestamp,
'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)), 'timestamp' : time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp)),
'date' : time.strftime('%d.%m.%Y', 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 # Überprüfe, ob die Checksummen übereinstimmen
source_text = template_c.render(context) if fcs.read_and_compare_checksum(output_sourcefile, checksum):
header_text = template_h.render(context) 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 # Überprüfe, ob die Checksummen übereinstimmen
with open(output_sourcefile, "w", encoding='utf-8') as f: if fcs.read_and_compare_checksum(output_headerfile, checksum):
f.write(source_text) print("Keine Änderungen in der Header-Datei erforderlich.")
with open(output_headerfile, "w", encoding='utf-8') as f: else:
f.write(header_text) # Rendere das Template mit den Werten und erhalte den Header-Text
print(f"Source-Dateien wurde erstellt: {output_sourcefile}, {output_headerfile}") 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}")

View File

@ -49,6 +49,6 @@ const DTC_t dtc_definitions[] = {
{% endfor -%} {% endfor -%}
}; };
const uint32_t dtc_generation_timestamp = {{ timestamp_unix }};
#endif // DTC_DEFS_H #endif // DTC_DEFS_H
// CODEGENERATOR_CHECKSUM: {{ checksum }}

View File

@ -21,3 +21,5 @@ void generateJsonObject_{{ var_name }}(JsonObject& data)
} }
{% endfor %} {% endfor %}
// CODEGENERATOR_CHECKSUM: {{ checksum }}

View File

@ -21,4 +21,6 @@
void generateJsonObject_{{ var_name }}(JsonObject& data); void generateJsonObject_{{ var_name }}(JsonObject& data);
{% endfor %} {% endfor %}
#endif /* _STRUCT2JSON_H_ */ #endif /* _STRUCT2JSON_H_ */
// CODEGENERATOR_CHECKSUM: {{ checksum }}

View File

@ -1,92 +1,96 @@
[ {
{ "codegenerator_checksum": "23dff82a4745f67041012080b05ec367c2dd44c6bb02974143b227ba49682b6f",
"num": 0, "timestamp": "2024-01-10 19:06:30",
"title": "No Error", "dtc_table_data": [
"description": "No Error" {
}, "num": 0,
{ "title": "No Error",
"num": 1, "description": "No Error"
"title": "Ölvorrat leer", },
"description": "Ölvorrat ist komplett leer. Den Ölvorrat auffüllen und im Menu 'Wartung' zurück setzen" {
}, "num": 1,
{ "title": "Ölvorrat leer",
"num": 2, "description": "Ölvorrat ist komplett leer. Den Ölvorrat auffüllen und im Menu 'Wartung' zurück setzen"
"title": "Ölvorrat niedrig", },
"description": "Ölvorrat ist unter der Warnschwelle. Den Ölvorrat demnächst auffüllen und im Menu 'Wartung' zurück setzen" {
}, "num": 2,
{ "title": "Ölvorrat niedrig",
"num": 3, "description": "Ölvorrat ist unter der Warnschwelle. Den Ölvorrat demnächst auffüllen und im Menu 'Wartung' zurück setzen"
"title": "kein EEPROM erkannt", },
"description": "Es wurde kein EEPROM gefunden. Dies lässt einen Hardware-Defekt vermuten." {
}, "num": 3,
{ "title": "kein EEPROM erkannt",
"num": 4, "description": "Es wurde kein EEPROM gefunden. Dies lässt einen Hardware-Defekt vermuten."
"title": "EEPROM CFG Checksumme", },
"description": "Die Checksumme der Config-Partition des EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'CFG' im Menu 'Wartung' zurück" {
}, "num": 4,
{ "title": "EEPROM CFG Checksumme",
"num": 5, "description": "Die Checksumme der Config-Partition des EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'CFG' im Menu 'Wartung' zurück"
"title": "EEPROM PDS Checksumme", },
"description": "Die Checksumme der Betriebsdaten-Partition des EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'PDS' im Menu 'Wartung' zurück" {
}, "num": 5,
{ "title": "EEPROM PDS Checksumme",
"num": 6, "description": "Die Checksumme der Betriebsdaten-Partition des EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'PDS' im Menu 'Wartung' zurück"
"title": "EEPROM PDS Adresse", },
"description": "Die Adresse der Betriebsdaten-Partition im EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'PDS' im Menu 'Wartung' zurück" {
}, "num": 6,
{ "title": "EEPROM PDS Adresse",
"num": 7, "description": "Die Adresse der Betriebsdaten-Partition im EEPROM ist ungültig. Setzen sie den EEPROM-Bereich 'PDS' im Menu 'Wartung' zurück"
"title": "EEPROM Version falsch", },
"description": "Die Layout-Version des EEPROM stimmt nicht mit der Firmware-Version überein. Setzen sie den EEPROM-Bereich 'CFG' im Menu 'Wartung' zurück" {
}, "num": 7,
{ "title": "EEPROM Version falsch",
"num": 8, "description": "Die Layout-Version des EEPROM stimmt nicht mit der Firmware-Version überein. Setzen sie den EEPROM-Bereich 'CFG' im Menu 'Wartung' zurück"
"title": "Flashspeicher Fehler", },
"description": "Der Flashspeicher konnte nicht initialisiert werden. Aktualisieren sie Flash & Firmware" {
}, "num": 8,
{ "title": "Flashspeicher Fehler",
"num": 9, "description": "Der Flashspeicher konnte nicht initialisiert werden. Aktualisieren sie Flash & Firmware"
"title": "Flashversion falsch", },
"description": "Die Version des Flashspeicher stimmt nicht mit der Firmware-Version überein. Aktualisieren sie den Flash mit der passenden Update-Datei" {
}, "num": 9,
{ "title": "Flashversion falsch",
"num": 10, "description": "Die Version des Flashspeicher stimmt nicht mit der Firmware-Version überein. Aktualisieren sie den Flash mit der passenden Update-Datei"
"title": "Keine GPS-Verbindung", },
"description": "Es wurde kein GPS-Signal über die serielle Schnittstelle empfangen, Prüfen sie die Verbindung und das GPS-Modul" {
}, "num": 10,
{ "title": "Keine GPS-Verbindung",
"num": 11, "description": "Es wurde kein GPS-Signal über die serielle Schnittstelle empfangen, Prüfen sie die Verbindung und das GPS-Modul"
"title": "CAN-Transceiver Error", },
"description": "Es konnte keine Verbindung zum CAN-Transceiver hergestellt werden. Prüfen Sie die Hardware auf Defekte" {
}, "num": 11,
{ "title": "CAN-Transceiver Error",
"num": 12, "description": "Es konnte keine Verbindung zum CAN-Transceiver hergestellt werden. Prüfen Sie die Hardware auf Defekte"
"title": "Keine CAN-Verbindung", },
"description": "Es konnte kein CAN-Signal empfangen werden. Prüfen sie die Verbindung und die Einstellungen" {
}, "num": 12,
{ "title": "Keine CAN-Verbindung",
"num": 13, "description": "Es konnte kein CAN-Signal empfangen werden. Prüfen sie die Verbindung und die Einstellungen"
"title": "Config-Validierung", },
"description": "Ein oder mehrer Einstellungswerte sind ausserhalb plausibler Werte. Prüfen Sie Ihre Einstellungen" {
}, "num": 13,
{ "title": "Config-Validierung",
"num": 14, "description": "Ein oder mehrer Einstellungswerte sind ausserhalb plausibler Werte. Prüfen Sie Ihre Einstellungen"
"title": "Dummy-DTC Info", },
"description": "Ein Dummy-DTC der Schwere \"Info\" für Debugging-Zwecke" {
}, "num": 14,
{ "title": "Dummy-DTC Info",
"num": 15, "description": "Ein Dummy-DTC der Schwere \"Info\" für Debugging-Zwecke"
"title": "Dummy-DTC Warnung", },
"description": "Ein Dummy-DTC der Schwere \"Warnung\" für Debugging-Zwecke" {
}, "num": 15,
{ "title": "Dummy-DTC Warnung",
"num": 16, "description": "Ein Dummy-DTC der Schwere \"Warnung\" für Debugging-Zwecke"
"title": "Dummy-DTC Kritisch", },
"description": "Ein Dummy-DTC der Schwere \"Kritisch\" für Debugging-Zwecke" {
}, "num": 16,
{ "title": "Dummy-DTC Kritisch",
"num": 17, "description": "Ein Dummy-DTC der Schwere \"Kritisch\" für Debugging-Zwecke"
"title": "Last Error", },
"description": "Last Error" {
} "num": 17,
] "title": "Last Error",
"description": "Last Error"
}
]
}

View File

@ -7,10 +7,10 @@
* It includes enums for DTC active status, severity levels, and specific DTC codes. * It includes enums for DTC active status, severity levels, and specific DTC codes.
* The file also defines an array of DTC definitions and a timestamp indicating the generation time. * The file also defines an array of DTC definitions and a timestamp indicating the generation time.
* *
* @note This file is auto-generated by a script on 2024-01-09 12:08:43. * @note This file is auto-generated by a script on 2024-01-10 18:37:05.
* *
* @author Marcel Peterkau * @author Marcel Peterkau
* @date 09.01.2024 * @date 10.01.2024
*/ */
#ifndef DTC_DEFS_H #ifndef DTC_DEFS_H
@ -80,6 +80,6 @@ const DTC_t dtc_definitions[] = {
{ DTC_LAST_DTC , DTC_NONE } // Last Error { DTC_LAST_DTC , DTC_NONE } // Last Error
}; };
const uint32_t dtc_generation_timestamp = 1704798523; #endif // DTC_DEFS_H
#endif // DTC_DEFS_H // CODEGENERATOR_CHECKSUM: 23dff82a4745f67041012080b05ec367c2dd44c6bb02974143b227ba49682b6f

View File

@ -3,10 +3,10 @@
* *
* @brief Header file for converting structs to JSON objects. * @brief Header file for converting structs to JSON objects.
* *
* @note This file is auto-generated by a script on 2024-01-09 20:41:57. * @note This file is auto-generated by a script on 2024-01-10 18:01:52.
* *
* @author Marcel Peterkau * @author Marcel Peterkau
* @date 09.01.2024 * @date 10.01.2024
*/ */
#ifndef _STRUCT2JSON_H_ #ifndef _STRUCT2JSON_H_
@ -21,4 +21,6 @@ void generateJsonObject_LubeConfig(JsonObject& data);
void generateJsonObject_PersistenceData(JsonObject& data); void generateJsonObject_PersistenceData(JsonObject& data);
#endif /* _STRUCT2JSON_H_ */ #endif /* _STRUCT2JSON_H_ */
// CODEGENERATOR_CHECKSUM: 9e8dd21170fd6ef8fbf8c4b156d9af751836a76081f811bf0e3ab2b1eb8ee48c

View File

@ -3,10 +3,10 @@
* *
* @brief Implementation file for converting structs to JSON objects. * @brief Implementation file for converting structs to JSON objects.
* *
* @note This file is auto-generated by a script on 2024-01-09 20:41:57. * @note This file is auto-generated by a script on 2024-01-10 18:01:52.
* *
* @author Marcel Peterkau * @author Marcel Peterkau
* @date 09.01.2024 * @date 10.01.2024
*/ */
@ -45,3 +45,6 @@ void generateJsonObject_PersistenceData(JsonObject& data)
data["checksum"] = PersistenceData.checksum; data["checksum"] = PersistenceData.checksum;
} }
// CODEGENERATOR_CHECKSUM: 9e8dd21170fd6ef8fbf8c4b156d9af751836a76081f811bf0e3ab2b1eb8ee48c