/*
 * BRLTTY - A background process providing access to the console screen (when in
 *          text mode) for a blind person using a refreshable braille display.
 *
 * Copyright (C) 1995-2023 by The BRLTTY Developers.
 *
 * BRLTTY comes with ABSOLUTELY NO WARRANTY.
 *
 * This is free software, placed under the terms of the
 * GNU Lesser General Public License, as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any
 * later version. Please see the file LICENSE-LGPL for details.
 *
 * Web Page: http://brltty.app/
 *
 * This software is maintained by Dave Mielke <dave@mielke.cc>.
 */

#ifndef BRLTTY_INCLUDED_DP_BRLDEFS
#define BRLTTY_INCLUDED_DP_BRLDEFS

#define DP_MAXIMUM_TEXT_COLUMNS 80

typedef enum {
  DP_REQ_FIRMWARE_VERSION  = 0X0000,
  DP_RSP_FIRMWARE_VERSION  = 0X0001,

  DP_REQ_DEVICE_NAME       = 0X0100,
  DP_RSP_DEVICE_NAME       = 0X0101,

  DP_REQ_BOARD_INFORMATION = 0X0110,
  DP_RSP_BOARD_INFORMATION = 0X0111,

  DP_REQ_DISPLAY_LINE      = 0X0200,
  DP_RSP_DISPLAY_LINE      = 0X0201,
  DP_NTF_DISPLAY_LINE      = 0X0202,

  DP_REQ_DISPLAY_CURSOR    = 0X0210,
  DP_RSP_DISPLAY_CURSOR    = 0X0211,
  DP_NTF_DISPLAY_CURSOR    = 0X0212,

  DP_NTF_KEYS_SCROLL        = 0X0302,
  DP_NTF_KEYS_PERKINS      = 0X0312,
  DP_NTF_KEYS_ROUTING      = 0X0322,
  DP_NTF_KEYS_FUNCTION     = 0X0332,

  DP_NTF_ERROR             = 0X9902,
} DP_Command;

typedef enum {
  DP_HAS_GRAPHIC_DISPLAY = 0X80,
  DP_HAS_TEXT_DISPLAY     = 0X40,
  DP_HAS_PERKINS_KEYS     = 0X20,
  DP_HAS_ROUTING_KEYS     = 0X10,
  DP_HAS_NAVIGATION_KEYS  = 0X08,
  DP_HAS_PANNING_KEYS     = 0X04,
  DP_HAS_FUNCTION_KEYS    = 0X02,
} DP_Features;

typedef enum {
  DP_DPC_6 = 0,
  DP_DPC_8 = 1,
} DP_DotsPerCell;

typedef struct {
  unsigned char rowCount; // 1, 2
  unsigned char columnCount; // 12, 14, 15, 16, 20, 24, 26, 28, 30, 32, 36, 40
  unsigned char dividedLine;
  unsigned char refreshTime; // 100ms
} DP_DisplayDescriptor;

typedef struct {
  unsigned char features;
  unsigned char dotsPerCell; // 0:6, 1:8
  unsigned char distanceBetweenPins; // 0.1mm
  unsigned char functionKeyCount;

  DP_DisplayDescriptor text;
  DP_DisplayDescriptor graphic;
} DP_BoardInformation;

typedef enum {
  DP_DSP_DOT1 = 0X01,
  DP_DSP_DOT2 = 0X02,
  DP_DSP_DOT3 = 0X04,
  DP_DSP_DOT4 = 0X10,
  DP_DSP_DOT5 = 0X20,
  DP_DSP_DOT6 = 0X40,
  DP_DSP_DOT7 = 0X08,
  DP_DSP_DOT8 = 0X80,
} DP_DisplayDots;

typedef enum {
  DP_DRC_ACK      = 0,
  DP_DRC_NACK     = 1,
  DP_DRC_WAIT     = 2,
  DP_DRC_CHECKSUM = 3,
} DP_DisplayResponseCode;

typedef enum {
  DP_SCL_LEFT_NEXT     = 28,
  DP_SCL_LEFT_PREV     = 29,
  DP_SCL_RIGHT_NEXT    = 30,
  DP_SCL_RIGHT_PREV    = 31,
} DP_ScrollKey;

typedef enum {
  DP_KBD_DOT7          =  0,
  DP_KBD_DOT3          =  1,
  DP_KBD_DOT2          =  2,
  DP_KBD_DOT1          =  3,
  DP_KBD_DOT4          =  4,
  DP_KBD_DOT5          =  5,
  DP_KBD_DOT6          =  6,
  DP_KBD_DOT8          =  7,

  DP_KBD_SPACE         =  8,
  DP_KBD_SHIFT_LEFT    =  9,
  DP_KBD_CONTROL_LEFT  = 10,
  DP_KBD_SHIFT_RIGHT   = 11,
  DP_KBD_CONTROL_RIGHT = 12,
  DP_PAN_LEFT          = 13,
  DP_PAN_RIGHT         = 14,

  DP_NAV_CENTER        = 16,
  DP_NAV_UP            = 17,
  DP_NAV_RIGHT         = 18,
  DP_NAV_DOWN          = 19,
  DP_NAV_LEFT          = 20,
} DP_PerkinsKey;

typedef enum {
  DP_GRP_ScrollKeys,
  DP_GRP_PerkinsKeys,
  DP_GRP_FunctionKeys,
  DP_GRP_RoutingKeys,
} DP_KeyGroup;

typedef enum {
  DP_ERR_LENGTH    = 1,
  DP_ERR_COMMAND   = 2,
  DP_ERR_CHECKSUM  = 3,
  DP_ERR_PARAMETER = 4,
  DP_ERR_TIMEOUT   = 5,
} DP_ErrorCode;

typedef enum {
  DP_PSB_SYNC1 = 0XAA,
  DP_PSB_SYNC2 = 0X55,
} DP_PacketSyncByte;

typedef enum {
  DP_SEQ_TEXT = 0X80,
} DP_PacketSeqFlag;

typedef struct {
  unsigned char sync[2];
  unsigned char length[2]; // big endian
  unsigned char destination;
  unsigned char command[2]; // big endian
  unsigned char seq;

  unsigned char data[DP_MAXIMUM_TEXT_COLUMNS + 1];
  // includes one-byte trailing checksum
} DP_PacketFields;

typedef union {
  unsigned char bytes[sizeof(DP_PacketFields)];
  DP_PacketFields fields;
} DP_Packet;

#endif /* BRLTTY_INCLUDED_DP_BRLDEFS */ 
