(* libsimpleio bindings for GNU Modula-2 *)

(* Copyright (C)2018-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.                                                 *)

DEFINITION MODULE FOR "C" libgpio;

  EXPORT UNQUALIFIED
    LINE_INFO_KERNEL,
    LINE_INFO_OUTPUT,
    LINE_INFO_ACTIVE_LOW,
    LINE_INFO_OPEN_DRAIN,
    LINE_INFO_OPEN_SOURCE,
    LINE_REQUEST_INPUT,
    LINE_REQUEST_OUTPUT,
    LINE_REQUEST_ACTIVE_HIGH,
    LINE_REQUEST_ACTIVE_LOW,
    LINE_REQUEST_PUSH_PULL,
    LINE_REQUEST_OPEN_DRAIN,
    LINE_REQUEST_OPEN_SOURCE,
    EVENT_REQUEST_NONE,
    EVENT_REQUEST_RISING,
    EVENT_REQUEST_FALLING,
    EVENT_REQUEST_BOTH,
    GPIO_chip_info,
    GPIO_line_info,
    GPIO_line_open,
    GPIO_line_close,
    GPIO_line_read,
    GPIO_line_write,
    GPIO_line_event;

  CONST
    LINE_INFO_KERNEL         = 0001H;
    LINE_INFO_OUTPUT         = 0002H;
    LINE_INFO_ACTIVE_LOW     = 0004H;
    LINE_INFO_OPEN_DRAIN     = 0008H;
    LINE_INFO_OPEN_SOURCE    = 0010H;

    LINE_REQUEST_INPUT       = 0001H;
    LINE_REQUEST_OUTPUT      = 0002H;
    LINE_REQUEST_ACTIVE_HIGH = 0000H;
    LINE_REQUEST_ACTIVE_LOW  = 0004H;
    LINE_REQUEST_PUSH_PULL   = 0000H;
    LINE_REQUEST_OPEN_DRAIN  = 0008H;
    LINE_REQUEST_OPEN_SOURCE = 0010H;

    EVENT_REQUEST_NONE       = 0000H;
    EVENT_REQUEST_RISING     = 0001H;
    EVENT_REQUEST_FALLING    = 0002H;
    EVENT_REQUEST_BOTH       = 0003H;

  PROCEDURE GPIO_chip_info
   (chip      : CARDINAL;
    VAR name  : ARRAY OF CHAR;
    namesize  : CARDINAL;
    VAR label : ARRAY OF CHAR;
    labelsize : CARDINAL;
    VAR lines : CARDINAL;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_info
   (chip      : CARDINAL;
    line      : CARDINAL;
    VAR flags : CARDINAL;
    VAR name  : ARRAY OF CHAR;
    namesize  : CARDINAL;
    VAR label : ARRAY OF CHAR;
    labelsize : CARDINAL;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_open
   (chip      : CARDINAL;
    line      : CARDINAL;
    flags     : CARDINAL;
    events    : CARDINAL;
    state     : CARDINAL;
    VAR fd    : INTEGER;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_close
   (fd        : INTEGER;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_read
   (fd        : INTEGER;
    VAR state : CARDINAL;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_write
   (fd        : INTEGER;
    state     : CARDINAL;
    VAR error : CARDINAL);

  PROCEDURE GPIO_line_event
   (fd        : INTEGER;
    VAR state : CARDINAL;
    VAR error : CARDINAL);

END libgpio.
