Add slot and counter support to programmable pre-signals

This commit is contained in:
Jonathan G Rennison
2020-09-01 18:37:53 +01:00
parent 5c0bf5b9e4
commit abb7b69861
9 changed files with 552 additions and 32 deletions

View File

@@ -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 },

View File

@@ -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);
}