remoteio_1.21805.1_406605ad/src/interfaces/i2c.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
-- Abstract interface for I2C bus controllers

-- Copyright (C)2016-2023, Philip Munts dba Munts Technologies.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- * Redistributions of source code must retain the above copyright notice,
--   this list of conditions and the following disclaimer.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.

WITH Ada.Strings.Fixed;
WITH Ada.Text_IO; USE Ada.Text_IO;

PACKAGE BODY I2C IS

  PACKAGE ByteIO IS NEW Ada.Text_IO.Modular_IO(Byte);

  -- Dump a command buffer in hexadecimal format

  PROCEDURE Dump
   (cmd     : Command;
    cmdlen  : Natural := Natural'Last) IS

    buf   : String(1 .. 6);
    count : Natural := cmdlen;

  BEGIN
    FOR b OF cmd LOOP
      EXIT WHEN count = 0;

      ByteIO.Put(buf, b, 16);

      IF buf(1) = ' ' THEN
        Ada.Strings.Fixed.Insert(buf, 5, "0", Ada.Strings.Left);
      END IF;

      Ada.Strings.Fixed.Replace_Slice(buf, 6, 6, " ");
      Ada.Strings.Fixed.Replace_Slice(buf, 1, 3, " ");

      Put(Ada.Strings.Fixed.Trim(buf, Ada.Strings.Both));
      Put(" ");

      count := count - 1;
    END LOOP;

    New_Line;
  END Dump;

  -- Dump a response buffer in hexadecimal format

  PROCEDURE Dump
   (resp    : Response;
    resplen : Natural := Natural'Last) IS

    buf   : String(1 .. 6);
    count : Natural := resplen;

  BEGIN
    FOR b OF resp LOOP
      EXIT WHEN count = 0;

      ByteIO.Put(buf, b, 16);

      IF buf(1) = ' ' THEN
        Ada.Strings.Fixed.Insert(buf, 5, "0", Ada.Strings.Left);
      END IF;

      Ada.Strings.Fixed.Replace_Slice(buf, 6, 6, " ");
      Ada.Strings.Fixed.Replace_Slice(buf, 1, 3, " ");

      Put(Ada.Strings.Fixed.Trim(buf, Ada.Strings.Both));
      Put(" ");

      count := count - 1;
    END LOOP;

    New_Line;
  END Dump;

  -- Get an I2C address value from operator

  FUNCTION GetAddress(prompt : String) RETURN Address IS

    addr : Address;

  BEGIN
    Put(prompt);
    AddressIO.Get(addr);
    RETURN addr;
  END GetAddress;

END I2C;