/* event.c */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <midi.h>
#include <midibase.h>

extern struct Window *Window;
extern UBYTE data [];
extern UBYTE disp [];
extern struct MSource *source;
#define LEVEL 1
#define TIME 0

#define ROOMITEM 0
#define HALLITEM 1
#define PLATEITEM 2
#define TAP9ITEM 3

/* calculates the checksum */
calccheck (checkpos,msgadd)
   LONG checkpos;/*checksum position in the message.Starts at 0. */
   UBYTE *msgadd;/* base address of the message. */
{
   UBYTE checksum;

   UBYTE total=0;
   LONG i = 5L;


   while (i<checkpos) {
   total=total+(*(msgadd+i));
   i++;
   }
   checksum = 0x7f & (256-total);
   *(msgadd+checkpos) = checksum;
}

sendsettings (checkpos)
   LONG checkpos;

{

   calccheck (checkpos,&data[0]);
   PutMidiMsg (source,&data[0]);
}

senddisplay (checkpos)
   LONG checkpos;

{

   calccheck (checkpos,&disp[0]);
   PutMidiMsg (source,&disp[0]);
}

LONG HandleEvent(class,code,address)
   ULONG class;/* provided by main*/
   USHORT code;
   APTR address;
{
   USHORT item;
   USHORT id;
   USHORT position;
   struct Gadget *g;
   struct PropInfo *info;

   switch(class)
   {
      case CLOSEWINDOW:
         return(0);
         break;

      case MENUPICK:
         if (MENUNUM(code) != 0) {

         break;
         }
         item = ITEMNUM(code);

         switch (item) {
            case ROOMITEM:
               data [7] = 1;
               data [8] = (UBYTE) ROOMITEM;
               sendsettings (9L);
               SetWindowTitles(Window,"Reverb Mode: Room",-1);
               break;
            case HALLITEM:
               data [7] = 1;
               data [8] = (UBYTE) HALLITEM;
               sendsettings (9L);
               SetWindowTitles(Window,"Reverb Mode: Hall",-1);
               break;
            case PLATEITEM:
               data [7] = 1;
               data [8] = (UBYTE) PLATEITEM;
               sendsettings (9L);
               SetWindowTitles(Window,"Reverb Mode: Plate",-1);
               break;
            case TAP9ITEM:
               data [7] = 1;
               data [8] = (UBYTE) TAP9ITEM;
               sendsettings (9L);
               SetWindowTitles(Window,"Reverb Mode: Tap9",-1);
               break;
         }
         return(1);
         break;

      case GADGETDOWN:

         return(1);
         break;

      case GADGETUP:
         g = (struct Gadget *) address;
         id = g->GadgetID;
         switch (id) {
            case TIME:
               info = (struct PropInfo *) (g->SpecialInfo);
               position = info->HorizPot / 8192;
               data [8] = (UBYTE) position;
               data[7] = 2;
               sendsettings (9L);
               break;

            case LEVEL:
               info = (struct PropInfo *) (g->SpecialInfo);
               position = info->HorizPot / 8192;
               data [8] = (UBYTE) position;
               data[7] = 3;
               sendsettings (9L);
               break;
         }
         return(1);
         break;
     }
     return(1);
}



