/*
  main.h
  created  12/2021
*/

#ifndef main_h
#define main_h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#ifndef FALSE
#define FALSE 0
#define TRUE !FALSE
#endif

#ifndef NULL
#define NULL 0
#endif

#define LIMIT(lo,x,hi) \
  if((x) < (lo)) (x) = (lo); \
  else if((x) > (hi)) (x) = (hi)

#define APP_NAME      "MidiKey"
#define APP_SPRITE    "midikey"
#define APP_DIR       "<"APP_NAME"$Dir>"
#define RESOURCES_DIR "<"APP_NAME"Res$Dir>"

// windows
enum { WIN_INFO,
       WIN_KBD,
       WIN_CHANNELS,
       NUM_WINDOWS };

// menus
enum { MENU_ICONBAR,
       MENU_KEYBOARD,
       MENU_MONITOR,
       MENU_CHANNEL,
       NUM_MENUS };

// Keyboard window icons
#define ICON_SHIFT_VAL      1
#define ICON_SHIFT_DEC      2
#define ICON_SHIFT_INC      3
#define ICON_MON_CHANS      5
#define ICON_MON_MENU       6
#define ICON_OUT_CHAN_VAL   8
#define ICON_OUT_CHAN_DEC   9
#define ICON_OUT_CHAN_INC  10
#define ICON_OUT_VELO_VAL  12
#define ICON_OUT_VELO_DEC  13
#define ICON_OUT_VELO_INC  14
#define ICON_BNK_HI_VAL    16
#define ICON_BNK_HI_DEC    17
#define ICON_BNK_HI_INC    18
#define ICON_BNK_LO_VAL    20
#define ICON_BNK_LO_DEC    21
#define ICON_BNK_LO_INC    22
#define ICON_BNK_PRG_VAL   24
#define ICON_BNK_PRG_DEC   25
#define ICON_BNK_PRG_INC   26
#define ICON_BNK_SEND      27
#define ICON_KBD_BACK      28
#define ICON_MIDDLE_C      29

// Channel window icons (+ 11 * channel_number[0..15])
#define ICON_CHN_PIT_BACK   5
#define ICON_CHN_PIT_SLDR   6
#define ICON_CHN_EXP_BACK   7
#define ICON_CHN_EXP_SLDR   8
#define ICON_CHN_VOL_BACK   9
#define ICON_CHN_VOL_SLDR  10
#define ICON_CHN_NUMBER    11
#define ICON_CHN_BNK_VAL   12
#define ICON_CHN_BNK_DEC   13
#define ICON_CHN_BNK_INC   14
#define ICON_CHN_PRG_VAL   15
#define ICON_CHN_PRG_DEC   16
#define ICON_CHN_PRG_INC   17
#define ICON_CHN_PRG_NAME  18

#define CHN_ROW_START       5 // first icon
#define CHN_ROW_ICONS      14 // icons per row

// slider control types
enum {
  SLDR_CHN_VOL,
  NUM_SLIDERS };

// slider definitions
struct slider_dfn_s
{
  int window; // currently selected slider window
  int icon;   // currently selected slider icon
  slider_t type[NUM_SLIDERS]; // slider type
};

// ro.flags bits
#define QUIT          0
#define MESSAGES_OPEN 1
#define TEMPLATES_OK  2
#define RUNNING       3 // set if already running
#define RUNNING2      4 // set if 2nd instance already running
#define CENTRALISE    5

// global variables
typedef struct ro_glbs_s
{
  int task_handle;
  int handle[NUM_WINDOWS];
  int cur_menu;
  int flags;

  struct caret_s
  {
    int window;
    int icon;
  } caret;

  struct slider_dfn_s slider;
} ro_glbs_t;

extern ro_glbs_t ro;

// midi_io.c
void midi_out_port(int status, int data1, int data2, int n);
void midi_in_port(void);

#endif
