controller.c 3.86 KB

/*====================================================================
 * Controller.c
 *
 * Audio performance monitoring tool
 *
 * Copyright 1995, Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
 * Inc.; the contents of this file may not be disclosed to third
 * parties, copied or duplicated in any form, in whole or in part,
 * without the prior written permission of Silicon Graphics, Inc.
 *
 * RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to
 * restrictions as set forth in subdivision (c)(1)(ii) of the Rights
 * in Technical Data and Computer Software clause at DFARS
 * 252.227-7013, and/or in similar or successor clauses in the FAR,
 * DOD or NASA FAR Supplement. Unpublished - rights reserved under the
 * Copyright Laws of the United States.
 *====================================================================*/

#include <ultralog.h>
#include <ramrom.h>
#include <assert.h>
#include <sched.h>
#include "music.h"
#include "sequence.h"
#include "musicUI.h"
#include "cursor.h"

#define kAutoKeyDelay	    30


static OSContStatus	statusdata[MAXCONTROLLERS];
static OSContPad	controllerdata[MAXCONTROLLERS];

extern u32              controller;
extern u32              controllervalid;

static void Stick2Crsr (s8 stickX, s8 stickY);

/*
 *
 * Return the lowest number controller connected to system
 */
s32
initControllers(void)
{
    OSMesgQueue	    serialMsgQ;
    OSMesg	        serialMsg;
    int		        i;
    u8		        pattern;

    osCreateMesgQueue(&serialMsgQ, &serialMsg, 1);
    osSetEventMesg(OS_EVENT_SI, &serialMsgQ, (OSMesg)1);

    osContInit(&serialMsgQ, &pattern, &statusdata[0]);

    for (i = 0; i < MAXCONTROLLERS; i++)
    {
        if ((pattern & (1<<i)) && !(statusdata[i].errno & CONT_NO_RESPONSE_ERROR))
            return i;
    }
    return -1;

}

void
UpdateController(void)
{
    u32         seqLen;
    OSContPad	*pad;
    UIEvent     event;
    static int	sAutoKeyCounter;
    static u32  sLastButton = 0;

    osContGetReadData(controllerdata);
    controllervalid = 1;
    pad = &controllerdata[controller];
    event.type = kNoEvent;

    if ((pad->button & CONT_G) && !(sLastButton & CONT_G))
    {
        SetMouseDown (TRUE);
        event.type = kMouseDown;
        Crsr_GetCoords (&event.where.x, &event.where.y);
    }

    if (!(pad->button & CONT_G) && IsMouseDown ())
    {
        SetMouseDown (FALSE);
        event.type = kMouseUp;
        Crsr_GetCoords (&event.where.x, &event.where.y);
    }

    if (event.type == kNoEvent && pad->button)
    {
	if (pad->button == sLastButton)
	{
	    if (sAutoKeyCounter++ > kAutoKeyDelay)
	    {
		event.type = kButtonDown;
		event.what = pad->button;
	    }
	}
	else
	{
	    sAutoKeyCounter = 0;
	    event.type = kButtonDown;
	    event.what = pad->button;
	}
    }

    if (event.type != kNoEvent)
        UIProcessEvent (&event);
    
    sLastButton = pad->button;
    Stick2Crsr (pad->stick_x, pad->stick_y);
    
}


static void
Stick2Crsr (s8 stickX, s8 stickY)
{
    static s16 stixelX = 0, stixelY = 0;
    s16 deltaX, deltaY;
    
    if (stickX < kCursorMaxZero && stickX > -kCursorMaxZero)
	stickX = 0;
    else if (stickX >= kCursorMaxZero)
	stickX -= kCursorMaxZero;
    else
	stickX += kCursorMaxZero;

    if (stickY < kCursorMaxZero && stickY > -kCursorMaxZero)
	stickY = 0;
    else if (stickY >= kCursorMaxZero)
	stickY -= kCursorMaxZero;
    else
	stickY += kCursorMaxZero;

    stixelX += stickX;
    stixelY += stickY;

    deltaX = stixelX >> 3;
    deltaY = stixelY >> 3;

    if (deltaX || deltaY)
        Crsr_SetDeltaCoords (deltaX, -deltaY);

    stixelX -= deltaX << 3;
    stixelY -= deltaY << 3;


#if 0    
    {
	static int count = 0;
	if (count++ == 60)
	{
		PRINTF("stickX:%d sX:%d dX:%d  stickY:%d sY:%d dY:%d\n", stickX, stixelX, deltaX, stickY, stixelY, deltaY);
	count = 0;
	}
    }
#endif
}