|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 12288 (0x3000) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Cl_35_Protocole, seg_0423a9
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
with Cl_35; with Serial_Port; with Conversion; with Text_Io; package body Cl_35_Protocole is Packet_Header : constant System.Byte_String (0 .. 0) := (0 => 16#01#); End_Of_Packet : constant System.Byte_String (0 .. 1) := (0 => 16#F1#, 1 => 16#F2#); Ack_String : constant System.Byte_String (0 .. 0) := (0 => 16#06#); Sum_Length : constant Natural := 2; Error_Description : String (1 .. 40); Read_Error : exception; function "&" (Left : System.Byte_String; Right : System.Byte_String) return System.Byte_String is Left_Length : constant Natural := Left'Length; Right_Length : constant Natural := Right'Length; Result : System.Byte_String (0 .. Left_Length + Right'Length - 1); begin for I in 0 .. Left_Length - 1 loop Result (I) := Left (I); end loop; for I in 0 .. Right_Length - 1 loop Result (I + Left_Length) := Right (I); end loop; return Result; end "&"; function Sum_String (Of_String : System.Byte_String) return System.Byte_String is String_Length : Natural := Of_String'Length + 1; Result : System.Byte_String (0 .. 1) := (0 => Conversion.In_System_Byte (Of_Object => (String_Length / 100)), 1 => Conversion.In_System_Byte (Of_Object => (String_Length mod 100))); begin return Result; end Sum_String; function Build_Packet (With_Message : System.Byte_String) return System.Byte_String is Message_Length : Natural := With_Message'Length; Result_Length : constant Natural := Cl_35_Protocole.Packet_Header'Length + Cl_35_Protocole.Sum_Length + With_Message'Length + Cl_35_Protocole.End_Of_Packet'Length; Result : System.Byte_String (0 .. Result_Length - 1); Adress_Byte : System.Byte_String (0 .. 0) := (0 => With_Message (0)); Message_Header : System.Byte_String (0 .. 0) := (0 => With_Message (1)); Message_Data : System.Byte_String (0 .. With_Message'Length - 3); begin for I in 2 .. Message_Length - 1 loop Message_Data (I - 2) := With_Message (I); end loop; Result := Packet_Header & Adress_Byte & Sum_String (Of_String => Message_Data) & Message_Header & Message_Data & End_Of_Packet; return Result; end Build_Packet; procedure Read_Header is A_Byte : System.Byte; Max : Natural := Packet_Header'Length - 1; begin for I in 0 .. Max loop Serial_Port.Get (A_Byte); if Natural (A_Byte) /= Natural (Packet_Header (0)) then Error_Description := "Invalid Header"; raise Read_Error; end if; end loop; end Read_Header; procedure Read_Adress (With_Control_Adress : Cl_35.Adress) is A_Byte : System.Byte; begin Serial_Port.Get (A_Byte); if Natural (A_Byte) /= Natural (With_Control_Adress) then Error_Description := "Invalid Adress"; raise Read_Error; end if; end Read_Adress; procedure Read_Sum (Result : in out Natural) is A_Byte : System.Byte; begin Serial_Port.Get (A_Byte); Result := Natural (A_Byte); for I in 1 .. Sum_Length loop Serial_Port.Get (A_Byte); Result := Result + (Natural (A_Byte) * 100 * I); end loop; end Read_Sum; procedure Read_Data (Number_Of_Bytes : Natural; Result : in out System.Byte_String) is A_Byte : System.Byte; begin for I in 1 .. Number_Of_Bytes loop Serial_Port.Get (A_Byte); Result (I) := A_Byte; end loop; end Read_Data; procedure Read_End_Of_Packet is Max : Natural := End_Of_Packet'Length - 1; A_Byte : System.Byte; begin for I in 0 .. Max loop Serial_Port.Get (A_Byte); if Natural (A_Byte) /= Natural (End_Of_Packet (I)) then Error_Description := "Invalid End Packet"; raise Read_Error; end if; end loop; end Read_End_Of_Packet; procedure Read_Answer (Of_Adress : Cl_35.Adress; Result_String : in out System.Byte_String) is Sum : Natural; begin Serial_Port.Open (With_Mode => "Read"); Read_Header; Read_Adress (With_Control_Adress => Of_Adress); Read_Sum (Result => Sum); Read_Data (Number_Of_Bytes => Sum, Result => Result_String); Read_End_Of_Packet; Serial_Port.Close; exception when Read_Error => Text_Io.Put_Line ("READ ERROR : " & Error_Description); Serial_Port.Close; end Read_Answer; procedure Send (The_Message : System.Byte_String; Error_Status : in out Boolean) is A_Byte : System.Byte; Answer_String : System.Byte_String (0 .. Ack_String'Length - 1); Adress : constant System.Byte := The_Message (0); begin Serial_Port.Open (With_Mode => "Write"); Serial_Port.Put (The_Byte_String => Build_Packet (With_Message => The_Message)); Serial_Port.Close; Read_Answer (Of_Adress => Adress, Result_String => Answer_String); --if Answer_String /= Ack_String then -- Text_Io.Put_Line ("Ack Error..."); --end if; end Send; procedure Send (The_Request : System.Byte_String; With_Answer : in out System.Byte_String; Error_Status : in out Boolean) is A_Byte : System.Byte; Sum : Natural := 0; begin Serial_Port.Open (With_Mode => "Write"); Serial_Port.Put (The_Byte_String => Build_Packet (With_Message => The_Request)); Serial_Port.Close; Serial_Port.Open (With_Mode => "Read"); Read_Header (Status => Error_Status); if Error_Status = False then Read_Adress (Status => Error_Status); end if; if Error_Status = False then Read_Sum (Status => Error_Status, Result => Sum); end if; if Error_Status = False then Read_Data (Status => Error_Status, Number_Of_Bytes => Sum, Result => With_Answer); end if; if Error_Status = False then Read_End_Of_Packet (Status => Error_Status); end if; Serial_Port.Close; end Send; end Cl_35_Protocole;
nblk1=b nid=a hdr6=e [0x00] rec0=22 rec1=00 rec2=01 rec3=04c [0x01] rec0=19 rec1=00 rec2=07 rec3=014 [0x02] rec0=19 rec1=00 rec2=06 rec3=00e [0x03] rec0=21 rec1=00 rec2=04 rec3=002 [0x04] rec0=1e rec1=00 rec2=03 rec3=018 [0x05] rec0=19 rec1=00 rec2=09 rec3=018 [0x06] rec0=1d rec1=00 rec2=05 rec3=000 [0x07] rec0=11 rec1=00 rec2=08 rec3=000 [0x08] rec0=13 rec1=00 rec2=03 rec3=001 [0x09] rec0=5d rec1=0c rec2=06 rec3=5d1 [0x0a] rec0=04 rec1=a1 rec2=30 rec3=000 tail 0x2153cd7d88628605f1407 0x42a00088462060003 Free Block Chain: 0xa: 0000 00 0b 03 eb 00 1d 20 20 20 20 20 20 20 20 41 5f ┆ A_┆ 0xb: 0000 00 08 00 0e 80 07 63 65 70 74 69 6f 6e 07 00 01 ┆ ception ┆ 0x8: 0000 00 02 00 1b 80 0b 20 52 69 67 68 74 20 28 49 29 ┆ Right (I)┆ 0x2: 0000 00 00 00 04 80 01 72 01 02 03 04 05 06 07 08 09 ┆ r ┆