-- DiagnosticsImplH.mesa - edited by:
-- Paul 10-Jan-84 14:11:13
-- RS232C Loopback Diagnostic module
DIRECTORY
Address USING [AddressTrouble, NetworkAddressToString, StringsToNetworkAddress],
CommOnlineDiagnostics USING [
CountType, GetRS232CResults, ModemChange, RS232CLoopback, RS232CDiagError,
PatternType, WriteMsg],
DiagnosticsOps USING [
CheckForAbort, RS232LineType, PutCR, PutChar, PutLine, PutLongNumber,
PutNumber, PutText],
Format USING [StringProc],
Heap USING [systemZone],
NetworkStream USING [AssignNetworkAddress],
NSConstants USING [echoerSocket],
Process USING [Detach, SecondsToTicks, SetTimeout, Pause],
RS232C USING [Correspondent, LineSpeed, LineType],
RS232CCorrespondents USING [nsSystemElement, xerox800],
String USING [Replace],
System USING [NetworkAddress, nullNetworkAddress];
DiagnosticsImplH: MONITOR
IMPORTS
Address, CommOnlineDiagnostics, DiagnosticsOps, Heap, NetworkStream, Process,
String
EXPORTS DiagnosticsOps =
BEGIN
doneWithSession: BOOLEAN ← FALSE;
results: CommOnlineDiagnostics.CountType;
hostAddr: System.NetworkAddress ← System.nullNetworkAddress;
showEchoes: BOOLEAN ← TRUE;
realLineType: RS232C.LineType;
RS232CLoopBackTest: PUBLIC PROCEDURE [
host: LONG STRING, hostNet: LONG STRING,
lineType: DiagnosticsOps.RS232LineType,
lineSpeed: RS232C.LineSpeed, pattern: CommOnlineDiagnostics.PatternType,
constant, minPacketSize, maxPacketSize: CARDINAL] =
BEGIN
CopyMyAddress: Format.StringProc = {
String.Replace[@myAddress, s, Heap.systemZone]};
myAddr: System.NetworkAddress = NetworkStream.AssignNetworkAddress[];
myAddress: LONG STRING ← NIL;
errFlag: BOOLEAN ← FALSE;
correspondentType: RS232C.Correspondent ←
IF lineType = bitSynchronous
THEN RS232CCorrespondents.nsSystemElement
ELSE RS232CCorrespondents.xerox800;
realLineType ←
IF lineType = bitSynchronous THEN bitSynchronous ELSE asynchronous;
hostAddr ← Address.StringsToNetworkAddress[
host, NSConstants.echoerSocket, hostNet !
Address.AddressTrouble =>
BEGIN
DiagnosticsOps.PutText["Host address translation troubles: "L];
DiagnosticsOps.PutLine[reason];
errFlag ← TRUE;
CONTINUE;
END];
IF hostAddr.net # myAddr.net OR hostAddr.host # myAddr.host THEN
showEchoes ← FALSE; -- can't show remotes
Address.NetworkAddressToString[
myAddr, CopyMyAddress !
Address.AddressTrouble =>
BEGIN
DiagnosticsOps.PutText["Local Network Address translation troubles: "L];
DiagnosticsOps.PutLine[reason];
errFlag ← TRUE;
CONTINUE;
END];
IF errFlag THEN RETURN;
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutLine[" RS232C Loopback Test Parameters:"L];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Local Network Address = "L];
DiagnosticsOps.PutText[myAddress];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["LoopBack Host = "L];
DiagnosticsOps.PutText[host];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Data Pattern: "L];
DiagnosticsOps.PutText[
SELECT pattern FROM
zero => "All 0's"L,
ones => "All 1's"L,
byteIncr => "Incrementing"L,
constant => "Constant"L,
ENDCASE => "Unknown"L];
DiagnosticsOps.PutCR[];
IF pattern = constant THEN {
DiagnosticsOps.PutText["Pattern: "L];
DiagnosticsOps.PutNumber[constant, 10];
DiagnosticsOps.PutCR[];
};
DiagnosticsOps.PutText["Minimum Packet Size: "L];
DiagnosticsOps.PutNumber[minPacketSize, 10];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Maximum Packet Size: "L];
DiagnosticsOps.PutNumber[maxPacketSize, 10];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Please install loopback plug on RS232 port, or set modem to Loopback before running this test."L];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutLine["Feedback key:"L];
DiagnosticsOps.PutLine["Each '!' represents a successful receive operation."L];
DiagnosticsOps.PutLine["Each '?' represents device error."L];
DiagnosticsOps.PutLine["Each '#' represents a receive error."L];
DiagnosticsOps.PutLine[
"Each '~' represents a packet which had data lost."L];
DiagnosticsOps.PutLine[
"Each ':' marks XMit error."L];
DiagnosticsOps.PutLine["Each '*' represents a bad seq # or missing data."L];
DiagnosticsOps.PutLine["Each '|' represents a good send operation."L];
DiagnosticsOps.PutLine["Each 'E' represents a send error."L];
DiagnosticsOps.PutCR[];
CommOnlineDiagnostics.RS232CLoopback[
rs232cParams: [
testCount: LAST[CARDINAL], lineSpeed: lineSpeed,
correspondent: correspondentType, lineType: realLineType,
lineNumber: 0, parity: even, charLength: 8, pattern: pattern,
constant: constant,
dataLengths: [low: minPacketSize, high: maxPacketSize]],
setDiagnosticLine: NIL,
writeMsg: RS232CFeedback, modemChange: ModemFeedback, host: hostAddr !
CommOnlineDiagnostics.RS232CDiagError =>
BEGIN
DiagnosticsOps.PutText["RS232C Error: "L];
DiagnosticsOps.PutLine[
SELECT reason FROM
aborted => "Aborted"L,
noHardware => "No RS232C Hardware"L,
noSuchLine => "No Such Line"L,
channelInUse => "Channel In Use"L,
unimplementedFeature => "Unimplemented Feature"L,
invalidParameter => "Invalid Parameter"L,
ENDCASE => "Unknown Error"L];
CONTINUE;
END]; --remote needs ServerOn!!!!!
DiagnosticsOps.PutLine["Rs232C Loopback Test Started"L];
doneWithSession ← FALSE;
Process.Detach[FORK Echoer[]];
DO
DiagnosticsOps.CheckForAbort[ ! ABORTED => EXIT];
Process.Pause[Process.SecondsToTicks[1]];
ENDLOOP;
doneWithSession ← TRUE;
[results] ← CommOnlineDiagnostics.GetRS232CResults[
stopIt: TRUE, host: hostAddr !
CommOnlineDiagnostics.RS232CDiagError =>
BEGIN
DiagnosticsOps.PutText["RS232C Error: "L];
DiagnosticsOps.PutLine[
SELECT reason FROM
aborted => "Aborted"L,
noHardware => "No RS232C Hardware"L,
noSuchLine => "No Such Line"L,
channelInUse => "Channel In Use"L,
unimplementedFeature => "Unimplemented Feature"L,
invalidParameter => "Invalid Parameter"L,
ENDCASE => "Unknown Error"L];
CONTINUE;
END];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutLine["Final results: "L];
PrintResults[];
DiagnosticsOps.PutLine["Done"L];
END; -- EchoUserTest --
Echoer: ENTRY PROC = {
cv: CONDITION;
Process.SetTimeout[@cv, Process.SecondsToTicks[10]];
UNTIL doneWithSession DO
WAIT cv;
IF doneWithSession THEN EXIT;
[results] ← CommOnlineDiagnostics.GetRS232CResults[
stopIt: FALSE, host: hostAddr !
CommOnlineDiagnostics.RS232CDiagError =>
BEGIN
DiagnosticsOps.PutText["RS232C Error: "L];
DiagnosticsOps.PutLine[
SELECT reason FROM
aborted => "Aborted"L,
noHardware => "No RS232C Hardware"L,
noSuchLine => "No Such Line"L,
channelInUse => "Channel In Use"L,
unimplementedFeature => "Unimplemented Feature"L,
invalidParameter => "Invalid Parameter"L,
ENDCASE => "Unknown Error"L];
EXIT;
END];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Intermediate results: "L];
PrintResults[];
ENDLOOP};
PrintResults: PROCEDURE [] = {
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Number of packets sent OK: "L];
DiagnosticsOps.PutLongNumber[results.sendOk, 10];
DiagnosticsOps.PutCR[];
IF realLineType = bitSynchronous THEN {
DiagnosticsOps.PutText["Number of good packets received: "L];
DiagnosticsOps.PutLongNumber[results.recOk, 10];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Number of packets not sent: "L];
DiagnosticsOps.PutLongNumber[results.sendErrors, 10];
DiagnosticsOps.PutCR[]};
DiagnosticsOps.PutText["Number of bytes sent: "L];
DiagnosticsOps.PutLongNumber[results.bytesSent, 10];
DiagnosticsOps.PutCR[];
DiagnosticsOps.PutText["Number of bytes received: "L];
DiagnosticsOps.PutLongNumber[results.bytesRec, 10];
DiagnosticsOps.PutCR[];
IF results.deviceError # 0 THEN {
DiagnosticsOps.PutText["Device errors: "L];
DiagnosticsOps.PutLongNumber[results.deviceError, 10];
DiagnosticsOps.PutCR[]};
IF results.checkSum # 0 THEN {
DiagnosticsOps.PutText["Transmit errors: "L];
DiagnosticsOps.PutLongNumber[results.checkSum, 10];
DiagnosticsOps.PutCR[]};
IF results.badSeq # 0 THEN {
DiagnosticsOps.PutText["Bad data: "L];
DiagnosticsOps.PutLongNumber[results.badSeq, 10];
DiagnosticsOps.PutCR[]};
IF results.missing # 0 THEN {
DiagnosticsOps.PutText["Missing data: "L];
DiagnosticsOps.PutLongNumber[results.missing, 10];
DiagnosticsOps.PutCR[]};
IF results.dataLost # 0 THEN {
DiagnosticsOps.PutText["Data Lost: "L];
DiagnosticsOps.PutLongNumber[results.dataLost, 10];
DiagnosticsOps.PutCR[]};
IF results.parity # 0 THEN {
DiagnosticsOps.PutText["Parity Errors: "L];
DiagnosticsOps.PutLongNumber[results.parity, 10];
DiagnosticsOps.PutCR[]};
DiagnosticsOps.PutCR[]};
RS232CFeedback: CommOnlineDiagnostics.WriteMsg =
BEGIN
-- If NOT showEchoes Then just Return
IF showEchoes THEN
DiagnosticsOps.PutChar[
SELECT msg FROM
recvOk => '!,
recvErrors => '#,
deviceError => '?,
dataLost => '~,
xmitErrors => ':,
badSeq => '*,
missing => '*,
sendOk => '|,
sendErrors => 'E,
ENDCASE => '@];
END;
ModemFeedback: CommOnlineDiagnostics.ModemChange =
BEGIN
-- If NOT showEchoes Then just Return
IF showEchoes THEN
DiagnosticsOps.PutText[
SELECT modemSignal FROM
dataSetReady => "Data Set Ready"L,
clearToSend => "Clear To Send"L,
carrierDetect => "Carrier Detect"L,
ringIndicator => "Ring Indicator"L,
ringHeard => "Ring Heard"L,
ENDCASE => "Unknown Modem Change"L];
DiagnosticsOps.PutLine[IF state THEN " TRUE"L ELSE " FALSE"L];
END;
END.