-- S.MG, 2018 -- prototype implementation of S.MG communication protocol with SMG_comms_types; use SMG_comms_types; with System; use System; -- endianness with Ada.Exceptions; with Ada.Streams; use Ada.Streams; package body SMG_comms_types is -- to and from network format (i.e. big endian, stream_element_array) procedure ToNetworkFormat( Item : in Octet_Array; Buffer : out Stream_Element_Array) is begin if Item'Length /= Buffer'Length then raise Constraint_Error with "Item and Buffer lengths do NOT match!"; end if; if Default_Bit_Order = Low_Order_First then for I in 0 .. Item'Length - 1 loop Buffer( Buffer'Last - Stream_Element_Offset(I) ) := Stream_Element(Item(Item'First + I)); end loop; else for I in 0 .. Item'Length - 1 loop Buffer( Buffer'First + Stream_Element_Offset(I) ) := Stream_Element(Item(Item'First + I)); end loop; end if; end ToNetworkFormat; procedure FromNetworkFormat( Buffer : in Stream_Element_Array; Item : out Octet_Array) is begin if Item'Length /= Buffer'Length then raise Constraint_Error with "Buffer and Item length do NOT match!"; end if; if Default_Bit_Order = Low_Order_First then for I in 0 .. Buffer'Length - 1 loop Item( Item'Last - I ) := Unsigned_8( Buffer( Buffer'First + Stream_Element_Offset( I ) ) ); end loop; else for I in 0 .. Buffer'Length - 1 loop Item( Item'First + I ) := Unsigned_8( Buffer( Buffer'First + Stream_Element_Offset( I ) ) ); end loop; end if; end FromNetworkFormat; -- Integer_8 procedure ToNetworkFormat( Item : in Integer_8; Buffer : out Stream_Element_Array) is begin ToNetworkFormat( Cast( Item ), Buffer ); end ToNetworkFormat; procedure FromNetworkFormat( Buffer : in Stream_Element_Array; Item : out Integer_8) is octets: Octets_1; begin FromNetworkFormat(Buffer, octets); Item := Cast( octets ); end FromNetworkFormat; end SMG_comms_types;