Add slot and counter support to programmable pre-signals
This commit is contained in:
@@ -72,7 +72,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
||||
{ 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_PROG_SIGS, XSCF_NULL, 2, 2, "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 },
|
||||
{ XSLFI_DEPARTURE_BOARDS, XSCF_IGNORABLE_UNKNOWN, 1, 1, "departure_boards", nullptr, nullptr, nullptr },
|
||||
|
||||
@@ -64,6 +64,21 @@ static void WriteCondition(Buffer &b, SignalCondition *c)
|
||||
WriteVLI(b, sc->sig_track);
|
||||
} break;
|
||||
|
||||
case PSC_SLOT_OCC:
|
||||
case PSC_SLOT_OCC_REM: {
|
||||
SignalSlotCondition *cc = static_cast<SignalSlotCondition*>(c);
|
||||
WriteVLI(b, cc->slot_id);
|
||||
WriteVLI(b, cc->comparator);
|
||||
WriteVLI(b, cc->value);
|
||||
} break;
|
||||
|
||||
case PSC_COUNTER: {
|
||||
SignalCounterCondition *cc = static_cast<SignalCounterCondition*>(c);
|
||||
WriteVLI(b, cc->ctr_id);
|
||||
WriteVLI(b, cc->comparator);
|
||||
WriteVLI(b, cc->value);
|
||||
} break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -88,6 +103,25 @@ static SignalCondition *ReadCondition(SignalReference this_sig)
|
||||
return new SignalStateCondition(this_sig, ti, td);
|
||||
}
|
||||
|
||||
case PSC_SLOT_OCC:
|
||||
case PSC_SLOT_OCC_REM: {
|
||||
TraceRestrictSlotID slot_id = (TraceRestrictSlotID) ReadVLI();
|
||||
SignalSlotCondition *c = new SignalSlotCondition(code, this_sig, slot_id);
|
||||
c->comparator = (SignalComparator) ReadVLI();
|
||||
if(c->comparator > SGC_LAST) NOT_REACHED();
|
||||
c->value = ReadVLI();
|
||||
return c;
|
||||
} break;
|
||||
|
||||
case PSC_COUNTER: {
|
||||
TraceRestrictCounterID ctr_id = (TraceRestrictCounterID) ReadVLI();
|
||||
SignalCounterCondition *c = new SignalCounterCondition(this_sig, ctr_id);
|
||||
c->comparator = (SignalComparator) ReadVLI();
|
||||
if(c->comparator > SGC_LAST) NOT_REACHED();
|
||||
c->value = ReadVLI();
|
||||
return c;
|
||||
}
|
||||
|
||||
default:
|
||||
return new SignalSimpleCondition(code);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user