a2sudoku/a2sudoku/mouseWrapper.c

80 lines
1.5 KiB
C

//
// mouseWrapper.c
// a2sudoku
//
// Created by Jeremy Rand on 2018-06-24.
// Copyright © 2018 Jeremy Rand. All rights reserved.
//
#include "mouseWrapper.h"
#include "drivers/a2_mouse_drv.h"
// Defines and macros
#define MOUSE_POS_SHIFT 4
#define MOUSE_GRID_SIZE (BOARD_SIZE << MOUSE_POS_SHIFT)
// Globals
static tMouseCallback gCursorPosCallback = NULL;
static bool gMouseInstalled = false;
static bool gMouseInPoll = false;
static struct mouse_box gMouseBox = { 0, 0, MOUSE_GRID_SIZE - 1, MOUSE_GRID_SIZE - 1 };
// Implementation
bool initMouse(tMouseCallback callback)
{
if (!gMouseInstalled) {
if (mouse_install(&mouse_def_callbacks, &a2_mouse_drv) == 0) {
gMouseInstalled = true;
mouse_setbox(&gMouseBox);
moveMouseToPos(0, 0);
}
}
gCursorPosCallback = callback;
return gMouseInstalled;
}
void shutdownMouse(void)
{
if (gMouseInstalled) {
mouse_uninstall();
gMouseInstalled = false;
}
}
void pollMouse(void)
{
struct mouse_info mouseInfo;
if (!gMouseInstalled)
return;
mouse_info(&mouseInfo);
gMouseInPoll = true;
gCursorPosCallback(mouseInfo.pos.x >> MOUSE_POS_SHIFT,
mouseInfo.pos.y >> MOUSE_POS_SHIFT);
gMouseInPoll = false;
}
void moveMouseToPos(tPos newX, tPos newY)
{
if (!gMouseInstalled)
return;
if (gMouseInPoll)
return;
mouse_move(newX << MOUSE_POS_SHIFT, newY << MOUSE_POS_SHIFT);
}