#include <stdio.h>
#include <stdlib.h>
#include "kernel.h"
// oslib
#include "os.h"
#include "osmodule.h"
//
#include "proto.h"
#include "midi.h"
#include "midi500.h"

// this source file handles the interface to the MIDI500 module


static int installed = 0;
static _kernel_swi_regs r;
static char *driver_name = "HBP10GM";
static int *driver;

os_error *midi500_rx_driver_service(_kernel_swi_regs *r, void *private);
os_error *midi500_rx_driver(_kernel_swi_regs *r, void *private);



int midi500_init(void *private) {

  if (installed)                                  return 0;
  if (xosmodule_alloc(100, (void **)&driver))     return 1;

  driver[0] = 0;
  driver[1] = (int)midi500_rx_driver_service;
  driver[2] = (int)midi500_rx_driver;
  driver[3] = (int)driver_name;

  r.r[0] = MIDI_INSTALL_RX_DRIVER + (0<<28);
  r.r[1] = (int)driver;
  r.r[2] = (int)private;
  if (_kernel_swi(MIDI_Driver, &r, &r))           return 1;
  if (r.r[0] == 0)                                return 1;

  installed = 1;
  return 0;
}


int midi500_kill(void *private) {

  if (installed) {
    r.r[0] = MIDI_REMOVE_RX_DRIVER + (0<<28);
    r.r[1] = (int)driver;
    r.r[2] = (int)private;
    if (_kernel_swi(MIDI_Driver, &r, &r))         return 1;
    installed = 0;
    xosmodule_free((void **)&driver);
  }

  return 0;
}

// ------------------------------------------------------------

os_error *midi500_rx_driver_service_code(_kernel_swi_regs *r, void *private) {

  switch (r->r[0]) {
  case 0: // installed
    break;
  case 1: // about to be removed
    break;
  }

  return NULL;
}


os_error *midi500_rx_driver_code(_kernel_swi_regs *r, void *private) {

  unsigned int cmd;
  unsigned char b[4];
  int n;

  cmd = r->r[0];
  ((unsigned int *)b)[0] = cmd;
  midi_rx_bytes(NULL, b, (cmd>>24) & 3, &n);

  return NULL;
}
