// GateConPRStats.bcpl

// Last modified January 31, 1979  10:45 PM by Boggs

get "Pup0.decl"

external
[
// outgoing procedure
PrintPRStats

// incoming procedures
Ws; PutTemplate; Puts; Error; Usc

// incoming static
dsp
]

manifest prStatsVersion = 1

structure PRStats:
[
statsType word
statsVersion word

packetsReceived word 2
imAliveReceived word 2
oneFragPupRcvd word 2
twoFragPupRcvd word 2
threeFragPupRcvd word 2
wordsReceived word 2

packetsSent word 2
imAliveSent word 2
oneFragPupSent word 2
twoFragPupSent word 2
threeFragPupSent word 2
wordsSent word 2

topsSent word 2
assemblyTimeout word 2
assemblyOverflow word 2
destinationDown word 2
inputFilter word 2
oldPackets word 2
skippedPackets word 2
sequencerResets word 2
outPacketsDiscarded word 2
transferTimeout word 2

maxHosts word
hostsUp↑1,1 word
]

//----------------------------------------------------------------------------
let PrintPRStats(pbi) be
//----------------------------------------------------------------------------
[
let stats = lv pbi>>PBI.pup.words
if stats>>PRStats.statsVersion ne prStatsVersion then
   [ Error("Incompatible format"); return ]

// convert from Mesa Long integer format to Bcpl double precision format:
let p = stats
while Usc(p, lv stats>>PRStats.transferTimeout) le 0 do
   [
   let temp = p!0; p!0 = p!1; p!1 = temp
   p = p+2
   ]

Ws("*NPacket Radio Statistics:")
Ws("*N                Pkts    Alives     One-F     Two-F   Three-F     Words")

Ws("*NSent:     ")
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.packetsSent)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.imAliveSent)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.oneFragPupSent)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.twoFragPupSent)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.threeFragPupSent)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.wordsSent)

Ws("*NRcvd:     ")
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.packetsReceived)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.imAliveReceived)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.oneFragPupRcvd)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.twoFragPupRcvd)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.threeFragPupRcvd)
PutTemplate(dsp, "$10EUD", lv stats>>PRStats.wordsReceived)

Ws("*N*N")
PutTemplate(dsp, "$10EUD  TOPs Sent ", lv stats>>PRStats.topsSent)
PutTemplate(dsp, "$10EUD  Input Fltr", lv stats>>PRStats.inputFilter)
PutTemplate(dsp, "$10EUD  Out Disc  ", lv stats>>PRStats.outPacketsDiscarded)

Puts(dsp, $*N)
PutTemplate(dsp, "$10EUD  Assy T-O  ", lv stats>>PRStats.assemblyTimeout)
PutTemplate(dsp, "$10EUD  Assy ovfl ", lv stats>>PRStats.assemblyOverflow)
PutTemplate(dsp, "$10EUD  Xfer T-O  ", lv stats>>PRStats.transferTimeout)

Puts(dsp, $*N)
PutTemplate(dsp, "$10EUD  Old Pkts  ", lv stats>>PRStats.oldPackets)
PutTemplate(dsp, "$10EUD  Skipped   ", lv stats>>PRStats.skippedPackets)
PutTemplate(dsp, "$10EUD  Seq Resets", lv stats>>PRStats.sequencerResets)

Ws("*NPR Host Status:")
for i = 1 to stats>>PRStats.maxHosts do
   PutTemplate(dsp, stats>>PRStats.hostsUp↑i? "    Up", "  Down")
Puts(dsp, $*N)
]