Initial implementation of tracerestrict counter mechanism
This commit is contained in:
@@ -71,6 +71,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||
{ XSLFI_TRACE_RESTRICT_STATUSCND,XSCF_NULL, 1, 1, "tracerestrict_status_cond", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_REVERSE, XSCF_NULL, 1, 1, "tracerestrict_reverse", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_NEWSCTRL,XSCF_NULL, 1, 1, "tracerestrict_newsctrl", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_TRACE_RESTRICT_COUNTER, XSCF_NULL, 1, 1, "tracerestrict_counter", nullptr, nullptr, "TRRC" },
|
||||
{ XSLFI_PROG_SIGS, XSCF_NULL, 1, 1, "programmable_signals", nullptr, nullptr, "SPRG" },
|
||||
{ XSLFI_ADJACENT_CROSSINGS, XSCF_NULL, 1, 1, "adjacent_crossings", nullptr, nullptr, nullptr },
|
||||
{ XSLFI_SAFER_CROSSINGS, XSCF_NULL, 1, 1, "safer_crossings", nullptr, nullptr, nullptr },
|
||||
|
||||
@@ -28,6 +28,7 @@ enum SlXvFeatureIndex {
|
||||
XSLFI_TRACE_RESTRICT_STATUSCND, ///< Trace restrict: train status condition
|
||||
XSLFI_TRACE_RESTRICT_REVERSE, ///< Trace restrict: reverse
|
||||
XSLFI_TRACE_RESTRICT_NEWSCTRL, ///< Trace restrict: news control
|
||||
XSLFI_TRACE_RESTRICT_COUNTER, ///< Trace restrict: counters
|
||||
XSLFI_PROG_SIGS, ///< programmable pre-signals patch
|
||||
XSLFI_ADJACENT_CROSSINGS, ///< Adjacent level crossings closure patch
|
||||
XSLFI_SAFER_CROSSINGS, ///< Safer level crossings
|
||||
|
||||
@@ -170,6 +170,44 @@ static void Save_TRRS()
|
||||
}
|
||||
}
|
||||
|
||||
static const SaveLoad _trace_restrict_counter_desc[] = {
|
||||
SLE_VAR(TraceRestrictCounter, value, SLE_INT32),
|
||||
SLE_SSTR(TraceRestrictCounter, name, SLF_ALLOW_CONTROL),
|
||||
SLE_VAR(TraceRestrictCounter, owner, SLE_UINT8),
|
||||
SLE_END()
|
||||
};
|
||||
|
||||
/**
|
||||
* Load counter pool
|
||||
*/
|
||||
static void Load_TRRC()
|
||||
{
|
||||
int index;
|
||||
while ((index = SlIterateArray()) != -1) {
|
||||
TraceRestrictCounter *ctr = new (index) TraceRestrictCounter();
|
||||
SlObject(ctr, _trace_restrict_counter_desc);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a counter, used by SlAutolength
|
||||
*/
|
||||
static void RealSave_TRRC(TraceRestrictCounter *ctr)
|
||||
{
|
||||
SlObject(ctr, _trace_restrict_counter_desc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save counter pool
|
||||
*/
|
||||
static void Save_TRRC()
|
||||
{
|
||||
for (TraceRestrictCounter *ctr : TraceRestrictCounter::Iterate()) {
|
||||
SlSetArrayIndex(ctr->index);
|
||||
SlAutolength((AutolengthProc*) RealSave_TRRC, ctr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update program reference counts from just-loaded mapping
|
||||
*/
|
||||
@@ -184,5 +222,6 @@ void AfterLoadTraceRestrict()
|
||||
extern const ChunkHandler _trace_restrict_chunk_handlers[] = {
|
||||
{ 'TRRM', Save_TRRM, Load_TRRM, nullptr, nullptr, CH_SPARSE_ARRAY}, // Trace Restrict Mapping chunk
|
||||
{ 'TRRP', Save_TRRP, Load_TRRP, nullptr, nullptr, CH_ARRAY}, // Trace Restrict Mapping Program Pool chunk
|
||||
{ 'TRRS', Save_TRRS, Load_TRRS, nullptr, nullptr, CH_ARRAY | CH_LAST}, // Trace Restrict Slot Pool chunk
|
||||
{ 'TRRS', Save_TRRS, Load_TRRS, nullptr, nullptr, CH_ARRAY}, // Trace Restrict Slot Pool chunk
|
||||
{ 'TRRC', Save_TRRC, Load_TRRC, nullptr, nullptr, CH_ARRAY | CH_LAST}, // Trace Restrict Counter Pool chunk
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user