Skip to content

Commit

Permalink
feat: Add functionality to modify event_handler_rules based on eh.csv
Browse files Browse the repository at this point in the history
  • Loading branch information
flap1 committed May 21, 2024
1 parent cad6d7f commit 5f81378
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 1 deletion.
2 changes: 2 additions & 0 deletions c2a_generator/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from .cmd_csv import generate # noqa
from .cmd_def_c import generate # noqa
from .cmd_def_h import generate # noqa
from .eh_rules_c import generate # noqa
from .eh_rules_h import generate # noqa
from .subobc_cmd_def_h import generate # noqa
from .subobc_tlm_buf_c import generate # noqa
from .subobc_tlm_buf_h import generate # noqa
Expand Down
54 changes: 54 additions & 0 deletions c2a_generator/eh_rules_c.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import csv
from pathlib import Path


def generate(src_path: str, dest_path: Path, eh_header: str) -> None:
assert dest_path.parent.exists(), f"{dest_path} does not exist"
with open(src_path, "r", encoding="utf-8") as csv_file, open(dest_path, "w", encoding="utf-8") as src_file:
src_file.write(
f"""
#pragma section REPRO
/**
* @file
* @brief EH の Rule 共通コード
*/
{eh_header}
void EH_load_default_rules(void)
{{
EH_RuleSettings settings;
"""[
1:
]
)
reader = csv.reader(csv_file)
headers = next(reader)
dict_reader = csv.DictReader(csv_file, fieldnames=headers)
for row in dict_reader:
if not any(row):
continue
code = ""
if row["description"]:
row_description = row["description"].replace("\n", "\n// ")
code += f" // {row_description}\n"
code += f" settings.event.group = {row['group']};\n"
code += f" settings.event.local = {row['local']};\n"
code += f" settings.event.err_level = EL_ERROR_LEVEL_{row['err_level']};\n"
code += f" settings.should_match_err_level = {1 if row['should_match_err_level'] == 'TRUE' else 0};\n"
code += f" settings.condition.type = EH_RESPONSE_CONDITION_{row['type'].upper()};\n"
code += f" settings.condition.count_threshold = {row['count_threshold']};\n"
code += f" settings.condition.time_threshold_ms = {int(float(row['time_threshold[s]']) * 1000)};\n"
code += f" settings.deploy_bct_id = {row['bc']};\n"
code += f" settings.is_active = {1 if row['should_match_err_level'] == 'TRUE' else 0};\n"
code += f" EH_register_rule({row['name']}, &settings);\n\n"
src_file.write(code)
src_file.write(
"""}
}
#pragma section
"""[
1:
]
)
56 changes: 56 additions & 0 deletions c2a_generator/eh_rules_h.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import csv
from pathlib import Path


def generate(src_path: str, dest_path: Path, base_id: int) -> None:
assert dest_path.parent.exists(), f"{dest_path} does not exist"
with open(src_path, "r", encoding="utf-8") as csv_file, open(dest_path, "w", encoding="utf-8") as header_file:
header_file.write(
"""
/**
* @file
* @brief EH の Rule 共通ヘッダ
*/
#ifndef EVENT_HANDLER_RULES_H_
#define EVENT_HANDLER_RULES_H_
/**
* @enum EH_RULE_ID
* @brief EH_Rule の ID
* @note 最大数は EH_RULE_MAX で規定
* @note uint16_t を想定
*/
typedef enum
{
"""[
1:
]
)
reader = csv.reader(csv_file)
headers = next(reader)
dict_reader = csv.DictReader(csv_file, fieldnames=headers)
for row in dict_reader:
if not any(row):
continue
try:
header_file.write(f' {row["name"]} = {base_id},\n')
base_id += 1
except ValueError:
continue
header_file.write(
"""
} EH_RULE_ID;
/**
* @brief event_handler のデフォルトルールを読み込む
* @param void
* @return void
*/
void EH_load_default_rules(void);
#endif
"""[
1:
]
)
18 changes: 17 additions & 1 deletion c2a_generator/wings_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ def generate(
aobc_csv_path: Optional[Path] = None,
tobc_csv_path: Optional[Path] = None,
mif_csv_path: Optional[Path] = None,
eh_src: Optional[Path] = None,
eh_base_id: int = 0,
eh_list: list = [],
) -> None:
data = []
if aobc_csv_path:
Expand All @@ -37,7 +40,20 @@ def generate(
if mif_csv_path:
mif_bc_dict = csv_to_json(mif_csv_path)
data.append({"obc_name": "MIF", "bc": mif_bc_dict, "el": [], "eh": []})
data.append({"obc_name": "MOBC", "bc": [], "el": [], "eh": []})
if eh_src:
with open(eh_src, "r", encoding="utf-8") as src_file:
reader = csv.reader(src_file)
headers = next(reader)
dict_reader = csv.DictReader(src_file, fieldnames=headers)

for row in dict_reader:
if not any(row):
continue
if not row["name"].strip():
continue
eh_list.append({"name": row["name"], "id": eh_base_id})
eh_base_id += 1
data.append({"obc_name": "MOBC", "bc": [], "el": [], "eh": eh_list})
bcid = 0
for src_path, bcid_base in bct_src:
if bcid_base is not None:
Expand Down
41 changes: 41 additions & 0 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,36 @@
Path(__file__).parent.parent / "sils-docker/sils/FlightSW/c2a-mobc-onglaisat"
)

# eh
c2a_generator.eh_rules_h.generate(
root_path / "design/eh.csv",
root_path / "src/src_user/Settings/System/EventHandlerRules/event_handler_rules.h",
base_id=9
)
c2a_generator.eh_rules_c.generate(
root_path / "design/eh.csv",
root_path / "src/src_user/Settings/System/EventHandlerRules/event_handler_rules.c",
eh_header="""
#include "event_handler_rules.h"
#include <src_core/System/EventManager/event_handler.h>
#include "../../../TlmCmd/block_command_definitions.h"
#include "../../../TlmCmd/block_command_definitions.h"
#include "../../../IfWrapper/uart_user.h"
#include "../../../Applications/UserDefined/Cdh/uart_fault_recovery.h"
#include "../../../Applications/UserDefined/Cdh/mode_monitor.h"
#include "../../../Applications/UserDefined/Power/under_voltage_control_utility.h"
#include "../../../Applications/UserDefined/Power/under_voltage_control.h"
#include "../../../Applications/UserDefined/Power/over_current.h"
#include "../../../Applications/UserDefined/Thermal/mobc_temperature_monitor.h"
#include "../../../Applications/UserDefined/Thermal/high_temperature_deviation_control.h"
#include "../../../Applications/UserDefined/Thermal/bat_heater_control.h"
#include "../../../Applications/UserDefined/Mission/mission_sequence.h"
#include "../../../Applications/UserDefined/Mission/rsi_sun_angle.h"
#include "../../../Applications/UserDefined/Com/comm_fdir.h"
"""
)

# cmd
c2a_generator.cmd_def_c.generate(
root_path / "design/cmd.csv",
Expand Down Expand Up @@ -101,4 +131,15 @@
bct_src,
root_path
/ "../../../wings/aspnetapp/WINGS/ClientApp/src/assets/alias/c2a_onglai.json",
eh_src=root_path / "design/eh.csv",
eh_base_id=9,
eh_list=[],
)

c2a_generator.wings_json.generate(
bct_src,
root_path / "database/c2a_onglai.json",
eh_src=root_path / "design/eh.csv",
eh_base_id=9,
eh_list=[],
)

0 comments on commit 5f81378

Please sign in to comment.