X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FInput%2FPS2KbMouse%2Fps2mouse.c;h=e80a14131d489b2c7113eae31a201487ddac7901;hb=ec0a3c65da8c3d47895ab2e5b4cec8cf2070f6eb;hp=7ccf461d5017723f43b4388058a7babf2b7c7e88;hpb=889b379627388811c630aad3214efcaee1ac9885;p=tpg%2Facess2.git diff --git a/Modules/Input/PS2KbMouse/ps2mouse.c b/Modules/Input/PS2KbMouse/ps2mouse.c index 7ccf461d..e80a1413 100644 --- a/Modules/Input/PS2KbMouse/ps2mouse.c +++ b/Modules/Input/PS2KbMouse/ps2mouse.c @@ -6,28 +6,24 @@ #include #include #include -#include -#include - -static inline int MIN(int a, int b) { return (a < b) ? a : b; } -static inline int MAX(int a, int b) { return (a > b) ? a : b; } +#include +#include +#include "common.h" // == CONSTANTS == #define NUM_AXIES 2 // X+Y #define NUM_BUTTONS 5 // Left, Right, Scroll Click, Scroll Up, Scroll Down -#define PS2_IO_PORT 0x60 // == PROTOTYPES == // - Internal - int PS2Mouse_Install(char **Arguments); -void PS2Mouse_IRQ(int Num); -static void mouseSendCommand(Uint8 cmd); -void PS2Mouse_Enable(); +void PS2Mouse_HandleInterrupt(Uint8 InputByte); // - Filesystem - Uint64 PS2Mouse_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); int PS2Mouse_IOCtl(tVFS_Node *Node, int ID, void *Data); // == GLOBALS == +void (*gpMouse_EnableFcn)(void); // - Settings int giMouse_Sensitivity = 1; int giMouse_MaxX = 640, giMouse_MaxY = 480; @@ -36,6 +32,9 @@ Uint8 gMouse_FileData[sizeof(tJoystick_FileHeader) + NUM_AXIES*sizeof(tJoystick_ tJoystick_FileHeader *gMouse_FileHeader = (void *)gMouse_FileData; tJoystick_Axis *gMouse_Axies; Uint8 *gMouse_Buttons; +tJoystick_Callback gMouse_Callback; + int gMouse_CallbackArg; + int giMouse_AxisLimits[2]; // - Internal State int giMouse_Cycle = 0; // IRQ Position Uint8 gaMouse_Bytes[4] = {0,0,0,0}; @@ -51,14 +50,19 @@ tDevFS_Driver gMouse_DriverStruct = { // == CODE == int PS2Mouse_Install(char **Arguments) { + + // Set up variables - gMouse_Axies = (void*)&gMouse_FileData[1]; + gMouse_Axies = (void*)&gMouse_FileData[4]; gMouse_Buttons = (void*)&gMouse_Axies[NUM_AXIES]; + + gMouse_FileHeader->NAxies = 2; gMouse_FileHeader->NButtons = 3; + gMouse_Axies[0].MinValue = -10; gMouse_Axies[0].MaxValue = 10; + gMouse_Axies[1].MinValue = -10; gMouse_Axies[1].MaxValue = 10; // Initialise Mouse Controller - IRQ_AddHandler(12, PS2Mouse_IRQ); // Set IRQ giMouse_Cycle = 0; // Set Current Cycle position - PS2Mouse_Enable(); // Enable the mouse + gpMouse_EnableFcn(); DevFS_AddDevice(&gMouse_DriverStruct); @@ -67,15 +71,14 @@ int PS2Mouse_Install(char **Arguments) /* Handle Mouse Interrupt */ -void PS2Mouse_IRQ(int Num) +void PS2Mouse_HandleInterrupt(Uint8 InputByte) { Uint8 flags; - int dx, dy; - int dx_accel, dy_accel; - + int d[2], d_accel[2]; + int i; // Gather mouse data - gaMouse_Bytes[giMouse_Cycle] = inb(0x60); + gaMouse_Bytes[giMouse_Cycle] = InputByte; LOG("gaMouse_Bytes[%i] = 0x%02x", gMouse_Axies[0].MaxValue); // - If bit 3 of the first byte is not set, it's not a valid packet? if(giMouse_Cycle == 0 && !(gaMouse_Bytes[0] & 0x08) ) @@ -95,25 +98,50 @@ void PS2Mouse_IRQ(int Num) if(flags & 0xC0) return; // Calculate dX and dY - dx = gaMouse_Bytes[1]; if(flags & 0x10) dx = -(256-dx); - dy = gaMouse_Bytes[2]; if(flags & 0x20) dy = -(256-dy); - dy = -dy; // Y is negated - LOG("RAW dx=%i, dy=%i\n", dx, dy); + d[0] = gaMouse_Bytes[1]; if(flags & 0x10) d[0] = -(256-d[0]); // x + d[1] = gaMouse_Bytes[2]; if(flags & 0x20) d[1] = -(256-d[1]); // y + d[1] = -d[1]; // Y is negated + LOG("RAW dx=%i, dy=%i\n", d[0], d[1]); // Apply scaling // TODO: Apply a form of curve to the mouse movement (dx*log(dx), dx^k?) // TODO: Independent sensitivities? // TODO: Disable acceleration via a flag? - dx_accel = dx*giMouse_Sensitivity; - dy_accel = dy*giMouse_Sensitivity; + d_accel[0] = d[0]*giMouse_Sensitivity; + d_accel[1] = d[1]*giMouse_Sensitivity; // Set Buttons (Primary) - gMouse_Buttons[0] = (flags & 1) ? 0xFF : 0; - gMouse_Buttons[1] = (flags & 2) ? 0xFF : 0; - gMouse_Buttons[2] = (flags & 4) ? 0xFF : 0; + for( i = 0; i < 3; i ++ ) + { + Uint8 newVal = (flags & (1 << i)) ? 0xFF : 0; + if(newVal != gMouse_Buttons[i]) { + if( gMouse_Callback ) + gMouse_Callback(gMouse_CallbackArg, 0, i, newVal - gMouse_Buttons[i]); + gMouse_Buttons[i] = newVal; + } + } // Update X and Y Positions - gMouse_Axies[0].CurValue = MIN( MAX(gMouse_Axies[0].MinValue, gMouse_Axies[0].CurValue + dx_accel), gMouse_Axies[0].MaxValue ); - gMouse_Axies[1].CurValue = MIN( MAX(gMouse_Axies[1].MinValue, gMouse_Axies[1].CurValue + dy_accel), gMouse_Axies[1].MaxValue ); + for( i = 0; i < 2; i ++ ) + { + Sint16 newCursor = 0; + if( giMouse_AxisLimits[i] ) + newCursor = MIN( MAX(0, gMouse_Axies[i].CursorPos + d_accel[i]), giMouse_AxisLimits[i] );; + + if( gMouse_Callback ) + { + if(giMouse_AxisLimits[i] && gMouse_Axies[i].CursorPos != newCursor) + gMouse_Callback(gMouse_CallbackArg, 1, i, newCursor - gMouse_Axies[i].CursorPos); + if(!giMouse_AxisLimits[i] && gMouse_Axies[i].CurValue != d_accel[i]) + gMouse_Callback(gMouse_CallbackArg, 1, i, d_accel[i] - gMouse_Axies[i].CurValue); + } + + gMouse_Axies[i].CurValue = d_accel[i]; + gMouse_Axies[i].CursorPos = newCursor; + } + +// Log("Mouse at %ix%i", gMouse_Axies[0].CursorPos, gMouse_Axies[1].CursorPos); + + VFS_MarkAvaliable(&gMouse_DriverStruct.RootNode, 1); } /* Read mouse state (coordinates) @@ -125,7 +153,8 @@ Uint64 PS2Mouse_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer if(Offset + Length > sizeof(gMouse_FileData)) Length = sizeof(gMouse_FileData) - Offset; memcpy(Buffer, &gMouse_FileData[Offset], Length); - + + VFS_MarkAvaliable(Node, 0); return Length; } @@ -150,15 +179,15 @@ int PS2Mouse_IOCtl(tVFS_Node *Node, int ID, void *Data) if(!info) return 0; if(info->Num < 0 || info->Num >= 2) return 0; if(info->Value != -1) - gMouse_Axies[info->Num].MaxValue = info->Value; - return gMouse_Axies[info->Num].MaxValue; + giMouse_AxisLimits[info->Num] = info->Value; + return giMouse_AxisLimits[info->Num]; case JOY_IOCTL_GETSETAXISPOSITION: if(!info) return 0; if(info->Num < 0 || info->Num >= 2) return 0; if(info->Value != -1) - gMouse_Axies[info->Num].CurValue = info->Value; - return gMouse_Axies[info->Num].CurValue; + gMouse_Axies[info->Num].CursorPos = info->Value; + return gMouse_Axies[info->Num].CursorPos; case JOY_IOCTL_GETSETAXISFLAGS: return -1; @@ -171,47 +200,3 @@ int PS2Mouse_IOCtl(tVFS_Node *Node, int ID, void *Data) } } -//== Internal Functions == -static inline void mouseOut64(Uint8 data) -{ - int timeout=100000; - while( timeout-- && inb(0x64) & 2 ); // Wait for Flag to clear - outb(0x64, data); // Send Command -} -static inline void mouseOut60(Uint8 data) -{ - int timeout=100000; - while( timeout-- && inb(0x64) & 2 ); // Wait for Flag to clear - outb(0x60, data); // Send Command -} -static inline Uint8 mouseIn60(void) -{ - int timeout=100000; - while( timeout-- && (inb(0x64) & 1) == 0); // Wait for Flag to set - return inb(0x60); -} -static inline void mouseSendCommand(Uint8 cmd) -{ - mouseOut64(0xD4); - mouseOut60(cmd); -} - -void PS2Mouse_Enable(void) -{ - Uint8 status; - Log_Log("PS2Mouse", "Enabling Mouse..."); - - // Enable AUX PS/2 - mouseOut64(0xA8); - - // Enable AUX PS/2 (Compaq Status Byte) - mouseOut64(0x20); // Send Command - status = mouseIn60(); // Get Status - status &= ~0x20; // Clear "Disable Mouse Clock" - status |= 0x02; // Set IRQ12 Enable - mouseOut64(0x60); // Send Command - mouseOut60(status); // Set Status - - //mouseSendCommand(0xF6); // Set Default Settings - mouseSendCommand(0xF4); // Enable Packets -}