Skip to content

Commit

Permalink
Implement TIU via JSON
Browse files Browse the repository at this point in the history
  • Loading branch information
cesarBLG committed Dec 7, 2024
1 parent c25e34c commit 83a9323
Show file tree
Hide file tree
Showing 6 changed files with 201 additions and 102 deletions.
10 changes: 2 additions & 8 deletions EVC/OR_interface/interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,15 +183,9 @@ void SetParameters()
};
manager.AddParameter(p);

p = new ORserver::Parameter("etcs::neutral_section");
p = new ORserver::Parameter("etcs::obu_tr");
p->GetValue = []() {
return (neutral_section_info.start ? std::to_string(*neutral_section_info.start) : "")+";"+(neutral_section_info.end ? std::to_string(*neutral_section_info.end) : "");
};
manager.AddParameter(p);

p = new ORserver::Parameter("etcs::lower_pantographs");
p->GetValue = []() {
return (lower_pantograph_info.start ? std::to_string(*lower_pantograph_info.start) : "")+";"+(lower_pantograph_info.end ? std::to_string(*lower_pantograph_info.end) : "");
return obu_tr_status;
};
manager.AddParameter(p);

Expand Down
2 changes: 1 addition & 1 deletion EVC/STM/stm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -766,7 +766,7 @@ void handle_stm_message(stm_message &msg)
tiu.close_air_intake = true;
if (ti.M_TIMS_CMD == M_TIMS_CMD_t::MainSwitchOpen)
tiu.open_circuit_breaker = true;
else if (ti.M_TIMS_CMD == M_TIMS_CMD_t::MainSwitchOpen)
else if (ti.M_TIMS_CMD == M_TIMS_CMD_t::MainSwitchClose)
tiu.open_circuit_breaker = false;
if (ti.M_TITR_CMD == M_TITR_CMD_t::TCO)
tiu.TCO = true;
Expand Down
18 changes: 17 additions & 1 deletion EVC/TrackConditions/track_condition.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ struct PlanningTrackCondition
TractionSystem = tractionSystem;
}
};
struct track_condition_profile_external
{
optional<double> start;
optional<double> end;
};
struct track_condition
{
TrackConditions condition;
Expand All @@ -104,12 +109,14 @@ struct track_condition
bool end_displayed;
int64_t end_time;
std::vector<std::shared_ptr<target>> targets;
optional<track_condition_profile_external> external;
track_condition() : start_symbol(TrackConditionType_DMI::None, false), end_symbol(TrackConditionType_DMI::None, false)
{
active_symbol = announcement_symbol = end_active_symbol = -1;
announce = order = display_end = end_displayed = false;
announce_distance = std::numeric_limits<double>::max();
}
virtual ~track_condition() = default;
virtual double get_distance_to_train()
{
if (condition == TrackConditions::BigMetalMasses)
Expand Down Expand Up @@ -140,7 +147,16 @@ struct track_condition_platforms : track_condition
bool left_side;
bool right_side;
};
extern std::list<std::shared_ptr<track_condition>> track_conditions;
struct track_condition_traction_change : track_condition
{
int m_voltage;
int nid_ctraction;
};
struct track_condition_current_consumption : track_condition
{
double max_current;
};
extern std::set<std::shared_ptr<track_condition>> track_conditions;
extern optional<distance> restore_initial_states_various;
void update_track_conditions();
void update_brake_contributions();
Expand Down
120 changes: 68 additions & 52 deletions EVC/TrackConditions/track_conditions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@
#include "../TrainSubsystems/power.h"
#include "../TrainSubsystems/train_interface.h"
#include "../Supervision/conversion_model.h"
std::list<std::shared_ptr<track_condition>> track_conditions;
std::set<std::shared_ptr<track_condition>> track_conditions;
std::set<distance> brake_change;
//std::map<track_condition*, std::vector<std::shared_ptr<target>>> track_condition_targets;
void add_condition();
void update_brake_contributions()
{
Expand Down Expand Up @@ -60,9 +59,6 @@ void update_brake_contributions()
}
void update_track_conditions()
{
neutral_section_info = {{},{}};
lower_pantograph_info = {{},{}};
air_tightness_info = {{},{}};
for (auto it = track_conditions.begin(); it != track_conditions.end();) {
track_condition *c = it->get();
double end = c->get_end_distance_to_train();
Expand Down Expand Up @@ -110,13 +106,14 @@ void update_track_conditions()
dist_base min = d_minsafefront(c->start);
distance &pointD = c->start;
distance &pointE = c->end;
if (pointC.max-max < 0) {
track_condition_profile_external info = {{},{}};
if (pointC.max-max < 0 && pointE.min-min > -L_TRAIN) {
track_condition_profile_external ext;
if (pointD.max-max > -L_TRAIN)
info.start = pointD.max-max;
if (pointE.min-min > -L_TRAIN)
info.end = pointE.min-min;
if (!neutral_section_info.start && !neutral_section_info.end) neutral_section_info = info;
ext.start = pointD.max-max;
ext.end = pointE.min-min;
c->external = ext;
} else {
c->external = {};
}
c->announce_distance = pointC.max-max;
if (min > c->end.min) {
Expand All @@ -135,13 +132,14 @@ void update_track_conditions()
dist_base min = d_minsafefront(c->start);
distance &pointD = c->start;
distance &pointE = c->end;
if (pointC.max-max < 0) {
track_condition_profile_external info = {{},{}};
if (pointC.max-max < 0 && pointE.min-min > -L_TRAIN) {
track_condition_profile_external ext;
if (pointD.max-max > -L_TRAIN)
info.start = pointD.max-max;
if (pointE.min-min > -L_TRAIN)
info.end = pointE.min-min;
if (!lower_pantograph_info.start && !lower_pantograph_info.end) lower_pantograph_info = info;
ext.start = pointD.max-max;
ext.end = pointE.min-min;
c->external = ext;
} else {
c->external = {};
}
c->announce_distance = pointC.max-max;
if (min > c->end.min) {
Expand All @@ -165,13 +163,14 @@ void update_track_conditions()
dist_base min = d_minsafefront(c->start);
distance &pointD = c->start;
distance &pointE = c->end;
if (pointC.max-max < 0) {
track_condition_profile_external info = {{},{}};
if (pointC.max-max < 0 && pointE.min-min > -L_TRAIN) {
track_condition_profile_external ext;
if (pointD.max-max > 0)
info.start = pointD.max-max;
if (pointE.min-min > -L_TRAIN)
info.end = pointE.min-min;
if (!air_tightness_info.start && !air_tightness_info.end) air_tightness_info = info;
ext.start = pointD.max-max;
ext.end = pointE.min-min;
c->external = ext;
} else {
c->external = {};
}
c->announce_distance = pointC.max-max;
if (min - L_TRAIN > c->end.min) {
Expand All @@ -187,7 +186,16 @@ void update_track_conditions()
} else if (c->condition == TrackConditions::ChangeOfTractionSystem) {
distance pointC = c->start - V_est * 20;
dist_base max = d_maxsafefront(c->start);
dist_base min = d_minsafefront(c->start) - L_TRAIN;
distance &pointF = c->start;
if (pointC.max-max < 0 && pointF.min-min > 0) {
track_condition_profile_external ext;
if (pointF.min-min > 0)
ext.start = pointF.max-max;
c->external = ext;
} else {
c->external = {};
}
c->announce_distance = pointC.max-max;
if (c->end_displayed) {
c->announce = false;
Expand All @@ -204,8 +212,13 @@ void update_track_conditions()
dist_base max = d_maxsafefront(c->start);
dist_base min = d_minsafefront(c->start) - L_TRAIN;
distance &pointF = c->start;
if (min < pointF.min) {

if (pointC.max-max < 0 && pointF.min-min > 0) {
track_condition_profile_external ext;
if (pointF.min-min > 0)
ext.start = pointF.max-max;
c->external = ext;
} else {
c->external = {};
}
} else if (c->condition == TrackConditions::RadioHole) {
distance &pointD = c->start;
Expand All @@ -223,28 +236,14 @@ void update_track_conditions()
dist_base min = d_minsafefront(c->start) - L_TRAIN;
distance &pointD = c->start;
distance &pointE = c->end;
if (pointC.max-max < 0) {
track_condition_profile_external info = {{},{}};
if (pointD.max-max > -L_TRAIN)
info.start = pointD.max-max;
if (pointE.min-min > -L_TRAIN)
info.end = pointE.min-min;
track_condition_profile_external *info2 = nullptr;
switch (c->condition) {
case TrackConditions::SwitchOffEddyCurrentEmergencyBrake:
info2 = &eddy_eb_inhibition;
break;
case TrackConditions::SwitchOffEddyCurrentServiceBrake:
info2 = &eddy_sb_inhibition;
break;
case TrackConditions::SwitchOffMagneticShoe:
info2 = &magnetic_inhibition;
break;
case TrackConditions::SwitchOffRegenerativeBrake:
info2 = &regenerative_inhibition;
break;
}
if (info2 != nullptr && !info2->start && !info2->end) *info2 = info;
if (pointC.max-max < 0 && pointE.min-min > 0) {
track_condition_profile_external ext;
if (pointD.max-max > 0)
ext.start = pointD.max-max;
ext.end = pointE.min-min;
c->external = ext;
} else {
c->external = {};
}
c->announce_distance = pointC.max-max;
if (min > c->end.min) {
Expand All @@ -257,6 +256,21 @@ void update_track_conditions()
c->announce = true;
c->order = false;
}
} else if (c->condition == TrackConditions::StationPlatform) {
distance pointC = c->start - V_est * 20;
dist_base max = d_maxsafefront(c->start);
dist_base min = d_minsafefront(c->start) - L_TRAIN;
distance &pointD = c->start;
distance &pointE = c->end;
if (pointC.max-max < 0 && pointE.min-min > 0) {
track_condition_profile_external ext;
if (pointD.max-max > 0)
ext.start = pointD.max-max;
ext.end = pointE.min-min;
c->external = ext;
} else {
c->external = {};
}
}
++it;
}
Expand All @@ -269,10 +283,12 @@ void load_track_condition_traction(TrackConditionChangeTractionSystem cond, dist
else
++it;
}
track_condition *tc = new track_condition();
track_condition_traction_change *tc = new track_condition_traction_change();
tc->start = ref + cond.D_TRACTION.get_value(cond.Q_SCALE);
tc->condition = TrackConditions::ChangeOfTractionSystem;
tc->profile = false;
tc->m_voltage = cond.M_VOLTAGE;
tc->nid_ctraction = cond.NID_CTRACTION;
TractionSystem_DMI traction;
switch (cond.M_VOLTAGE.rawdata) {
case M_VOLTAGE_t::NonFitted: traction = TractionSystem_DMI::NonFitted; break;
Expand All @@ -286,7 +302,7 @@ void load_track_condition_traction(TrackConditionChangeTractionSystem cond, dist
tc->announcement_symbol = 25 + cond.M_VOLTAGE.rawdata*2 + (automatic_traction_system_change ? 0 : 1);
tc->active_symbol = 23 + cond.M_VOLTAGE.rawdata*2 + (automatic_traction_system_change ? 0 : 1);
tc->end_active_symbol = tc->active_symbol;
track_conditions.push_back(std::shared_ptr<track_condition>(tc));
track_conditions.insert(std::shared_ptr<track_condition_traction_change>(tc));
}
void load_track_condition_bigmetal(TrackConditionBigMetalMasses cond, distance ref)
{
Expand All @@ -313,7 +329,7 @@ void load_track_condition_bigmetal(TrackConditionBigMetalMasses cond, distance r
tc->end = tc->start + it->L_TRACKCOND.get_value(cond.Q_SCALE);
tc->profile = true;
tc->condition = TrackConditions::BigMetalMasses;
track_conditions.push_back(std::shared_ptr<track_condition>(tc));
track_conditions.insert(std::shared_ptr<track_condition>(tc));
}
}
void load_track_condition_various(TrackCondition cond, distance ref, bool special)
Expand Down Expand Up @@ -462,7 +478,7 @@ void load_track_condition_various(TrackCondition cond, distance ref, bool specia
if (exists)
delete tc;
else
track_conditions.push_back(std::shared_ptr<track_condition>(tc));
track_conditions.insert(std::shared_ptr<track_condition>(tc));

}
update_brake_contributions();
Expand Down Expand Up @@ -509,6 +525,6 @@ void load_track_condition_platforms(TrackConditionStationPlatforms cond, distanc
tc->right_side = it->Q_PLATFORM != Q_PLATFORM_t::LeftSide;
tc->left_side = it->Q_PLATFORM != Q_PLATFORM_t::RightSide;
tc->condition = TrackConditions::StationPlatform;
track_conditions.push_back(std::shared_ptr<track_condition>(tc));
track_conditions.insert(std::shared_ptr<track_condition>(tc));
}
}
Loading

0 comments on commit 83a9323

Please sign in to comment.