Merge pull request #63 from inmarket/master
GINPUT Dial. Simplify input -> GWIN widget assignment
This commit is contained in:
commit
1d24b6977d
18 changed files with 864 additions and 344 deletions
|
@ -201,28 +201,24 @@ StepCalibrate:
|
|||
gwinSetButtonText(ghNext, "Next", FALSE);
|
||||
gsNext = gwinGetButtonSource(ghNext);
|
||||
geventAttachSource(&gl, gsNext, 0);
|
||||
gwinAttachButtonMouseSource(ghNext, gs);
|
||||
gwinAttachButtonMouse(ghNext, 0);
|
||||
|
||||
ghPrev = gwinCreateButton(&gPrev, swidth-100, 0, 50, 20, font, GBTN_NORMAL);
|
||||
gwinSetButtonText(ghPrev, "Back", FALSE);
|
||||
gsPrev = gwinGetButtonSource(ghPrev);
|
||||
geventAttachSource(&gl, gsPrev, 0);
|
||||
gwinAttachButtonMouseSource(ghPrev, gs);
|
||||
gwinAttachButtonMouse(ghPrev, 0);
|
||||
|
||||
#if 0
|
||||
{
|
||||
GSourceHandle gsButton1, gsButton2;
|
||||
|
||||
// Attach a couple of hardware toggle buttons to our Next and Back buttons as well.
|
||||
// We can always use the mouse to trigger the buttons if you don't want to use hardware toggles.
|
||||
// This code depends on your hardware. Turn it on only if you have
|
||||
// defined a board definition for your toggle driver. Then change
|
||||
// the next two lines to be correct for your hardware. The values
|
||||
// below are correct for the Win32 toggle driver.
|
||||
gsButton1 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY1);
|
||||
gsButton2 = ginputGetToggle(GINPUT_TOGGLE_MOMENTARY2);
|
||||
gwinAttachButtonToggleSource(ghNext, gsButton2);
|
||||
gwinAttachButtonToggleSource(ghPrev, gsButton1);
|
||||
gwinAttachButtonToggle(ghNext, GINPUT_TOGGLE_MOMENTARY1);
|
||||
gwinAttachButtonToggle(ghPrev, GINPUT_TOGGLE_MOMENTARY2);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -53,5 +53,6 @@
|
|||
|
||||
/* Features for the GINPUT sub-system. */
|
||||
#define GINPUT_NEED_MOUSE TRUE
|
||||
#define GINPUT_NEED_DIAL TRUE
|
||||
|
||||
#endif /* _GFXCONF_H */
|
||||
|
|
|
@ -31,7 +31,7 @@ int main(void) {
|
|||
coord_t swidth, sheight;
|
||||
GHandle ghSliderH, ghSliderV, ghConsole;
|
||||
font_t fui2;
|
||||
GSourceHandle gsMouse;
|
||||
GEvent * pe;
|
||||
GEventGWinSlider * pSliderEvent;
|
||||
BaseSequentialStream *consout;
|
||||
|
||||
|
@ -58,10 +58,15 @@ int main(void) {
|
|||
gwinSetColor(ghConsole, White);
|
||||
gwinSetBgColor(ghConsole, Blue);
|
||||
|
||||
// Assign the mouse to the sliders.
|
||||
gsMouse = ginputGetMouse(0);
|
||||
gwinAttachSliderMouseSource(ghSliderH, gsMouse);
|
||||
gwinAttachSliderMouseSource(ghSliderV, gsMouse);
|
||||
// Assign the mouse and dials to the sliders.
|
||||
#if GINPUT_NEED_MOUSE
|
||||
gwinAttachSliderMouse(ghSliderH, 0);
|
||||
gwinAttachSliderMouse(ghSliderV, 0);
|
||||
#endif
|
||||
#if GINPUT_NEED_DIAL
|
||||
gwinAttachSliderDial(ghSliderV, 0);
|
||||
gwinAttachSliderDial(ghSliderH, 1);
|
||||
#endif
|
||||
|
||||
// We want to listen for slider events
|
||||
geventListenerInit(&gl);
|
||||
|
@ -75,14 +80,14 @@ int main(void) {
|
|||
|
||||
while(1) {
|
||||
// Get an Event
|
||||
// - we can assume it is a slider event as that is all we are listening for
|
||||
pSliderEvent = (GEventGWinSlider *)geventEventWait(&gl, TIME_INFINITE);
|
||||
|
||||
// Double check that assumption
|
||||
if (pSliderEvent->type != GEVENT_GWIN_SLIDER)
|
||||
continue;
|
||||
pe = geventEventWait(&gl, TIME_INFINITE);
|
||||
|
||||
switch(pe->type) {
|
||||
case GEVENT_GWIN_SLIDER:
|
||||
pSliderEvent = (GEventGWinSlider *)pe;
|
||||
chprintf(consout, "%c=%d\n", pSliderEvent->slider == ghSliderH ? 'H' : 'V', pSliderEvent->position);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
6
demos/modules/gwin/slider/readme.txt
Normal file
6
demos/modules/gwin/slider/readme.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
This demo supports input from both a mouse/touch and/or a dial input.
|
||||
If your platform does not support one or the other, turn it off in
|
||||
gfxconf.h
|
||||
|
||||
Note that you will need to include the drivers into your project
|
||||
makefile for whichever inputs you decide to use.
|
5
drivers/ginput/dial/GADC/ginput_lld.mk
Normal file
5
drivers/ginput/dial/GADC/ginput_lld.mk
Normal file
|
@ -0,0 +1,5 @@
|
|||
# List the required driver.
|
||||
GFXSRC += $(GFXLIB)/drivers/ginput/dial/GADC/ginput_lld_dial.c
|
||||
|
||||
# Required include directories
|
||||
GFXINC += $(GFXLIB)/drivers/ginput/dial/GADC
|
101
drivers/ginput/dial/GADC/ginput_lld_dial.c
Normal file
101
drivers/ginput/dial/GADC/ginput_lld_dial.c
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
ChibiOS/GFX - Copyright (C) 2012, 2013
|
||||
Joel Bodenmann aka Tectu <joel@unormal.org>
|
||||
|
||||
This file is part of ChibiOS/GFX.
|
||||
|
||||
ChibiOS/GFX is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/GFX is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file drivers/ginput/dial/GADC/ginput_lld_dial.c
|
||||
* @brief GINPUT Dial low level driver source for GADC hardware.
|
||||
*
|
||||
* @defgroup Dial Dial
|
||||
* @ingroup GINPUT
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
#include "gfx.h"
|
||||
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
|
||||
#include "ginput/lld/dial.h"
|
||||
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 5
|
||||
#error "GINPUT: Dial - GADC driver currently only supports 4 devices"
|
||||
#endif
|
||||
|
||||
static adcsample_t samplebuf[GINPUT_DIAL_NUM_PORTS];
|
||||
|
||||
#if GINPUT_DIAL_CYCLE_POLL
|
||||
static uint16_t cycle;
|
||||
#endif
|
||||
|
||||
static void GADCCallback(adcsample_t *buffer, void *param) {
|
||||
((DialCallbackFn)param)(buffer-samplebuf, buffer[0]);
|
||||
}
|
||||
|
||||
void ginput_lld_dial_init(void) {
|
||||
#if GINPUT_DIAL_CYCLE_POLL
|
||||
cycle = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ginput_lld_dial_poll(DialCallbackFn fn) {
|
||||
#if GINPUT_DIAL_CYCLE_POLL
|
||||
switch(cycle++) {
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 1
|
||||
case 0:
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE0, samplebuf+0, GADCCallback, (void *)fn);
|
||||
break;
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 2
|
||||
case 1:
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE1, samplebuf+1, GADCCallback, (void *)fn);
|
||||
break;
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 3
|
||||
case 2:
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE2, samplebuf+2, GADCCallback, (void *)fn);
|
||||
break;
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 4
|
||||
case 3:
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE3, samplebuf+3, GADCCallback, (void *)fn);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
if (cycle >= GINPUT_DIAL_NUM_PORTS)
|
||||
cycle = 0;
|
||||
#else
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 1
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE0, samplebuf+0, GADCCallback, (void *)fn);
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 2
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE1, samplebuf+1, GADCCallback, (void *)fn);
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 3
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE2, samplebuf+2, GADCCallback, (void *)fn);
|
||||
#endif
|
||||
#if GINPUT_DIAL_NUM_PORTS >= 4
|
||||
gadcLowSpeedStart(GINPUT_DIAL_DEVICE3, samplebuf+3, GADCCallback, (void *)fn);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
|
||||
/** @} */
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
ChibiOS/GFX - Copyright (C) 2012, 2013
|
||||
Joel Bodenmann aka Tectu <joel@unormal.org>
|
||||
|
||||
This file is part of ChibiOS/GFX.
|
||||
|
||||
ChibiOS/GFX is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/GFX is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file drivers/ginput/dial/GADC/ginput_lld_dial_board_olimexsam7ex256.h
|
||||
* @brief GINPUT Dial Driver config file.
|
||||
*
|
||||
* @defgroup Dial Dial
|
||||
* @ingroup GINPUT
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _GINPUT_LLD_DIAL_BOARD_OLIMEXSAM7EX256_H
|
||||
#define _GINPUT_LLD_DIAL_BOARD_OLIMEXSAM7EX256_H
|
||||
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Analogue devices on this board */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define GINPUT_DIAL_NUM_PORTS 1
|
||||
#define GINPUT_DIAL_DEVICE0 GADC_PHYSDEV_DIAL
|
||||
#define GINPUT_DIAL_POLL_PERIOD 200
|
||||
#define GINPUT_DIAL_CYCLE_POLL FALSE
|
||||
|
||||
#endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
|
||||
|
||||
#endif /* _GINPUT_LLD_DIAL_BOARD_OLIMEXSAM7EX256_H */
|
||||
/** @} */
|
||||
|
50
drivers/ginput/dial/GADC/ginput_lld_dial_config.h
Normal file
50
drivers/ginput/dial/GADC/ginput_lld_dial_config.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
ChibiOS/GFX - Copyright (C) 2012, 2013
|
||||
Joel Bodenmann aka Tectu <joel@unormal.org>
|
||||
|
||||
This file is part of ChibiOS/GFX.
|
||||
|
||||
ChibiOS/GFX is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/GFX is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file drivers/ginput/dial/GADC/ginput_lld_dial_config.h
|
||||
* @brief GINPUT Dial Driver configuration header.
|
||||
*
|
||||
* @defgroup Dial Dial
|
||||
* @ingroup GINPUT
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _GINPUT_LLD_DIAL_CONFIG_H
|
||||
#define _GINPUT_LLD_DIAL_CONFIG_H
|
||||
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
|
||||
#define GINPUT_DIAL_MAX_VALUE ((1<<GADC_BITS_PER_SAMPLE)-1)
|
||||
|
||||
#if GINPUT_TOGGLE_USE_CUSTOM_BOARD
|
||||
/* Include the user supplied board definitions */
|
||||
#include "ginput_lld_dial_board.h"
|
||||
#elif defined(BOARD_OLIMEX_SAM7_EX256)
|
||||
#include "ginput_lld_dial_board_olimexsam7ex256.h"
|
||||
#else
|
||||
/* Include the user supplied board definitions */
|
||||
#include "ginput_lld_dial_board.h"
|
||||
#endif
|
||||
|
||||
#endif /* GFX_USE_GDISP && GINPUT_NEED_DIAL */
|
||||
|
||||
#endif /* _GINPUT_LLD_DIAL_CONFIG_H */
|
||||
/** @} */
|
16
drivers/ginput/dial/GADC/readme.txt
Normal file
16
drivers/ginput/dial/GADC/readme.txt
Normal file
|
@ -0,0 +1,16 @@
|
|||
To use this driver:
|
||||
|
||||
1. Add in your halconf.h:
|
||||
a) #define GFX_USE_GINPUT TRUE
|
||||
#define GINPUT_NEED_DIAL TRUE
|
||||
#define GINPUT_NEED_GADC TRUE
|
||||
d) If you are not using a known board then create a ginput_lld_toggle_board.h file
|
||||
and ensure it is on your include path.
|
||||
Use the ginput_lld_dial_board_example.h file as a basis.
|
||||
Currently known boards are:
|
||||
Olimex SAM7-EX256
|
||||
|
||||
2. To your makefile add the following lines:
|
||||
include $(GFXLIB)/drivers/ginput/dial/GADC/ginput_lld.mk
|
||||
include $(GFXLIB)/drivers/gadc/yourGADCdriver/gadc_lld.mk
|
||||
|
|
@ -76,8 +76,7 @@ extern "C" {
|
|||
|
||||
/**
|
||||
* @brief Get the maximum value
|
||||
* @details The readings are scaled to be 0 ... max-1.
|
||||
* 0 means over the full uint16_t range.
|
||||
* @details The readings are scaled to be 0 ... max.
|
||||
*
|
||||
* @param[in] instance The ID of the dial input instance
|
||||
*
|
||||
|
@ -87,7 +86,7 @@ extern "C" {
|
|||
|
||||
/**
|
||||
* @brief Set the maximum value
|
||||
* @note This shouldn't be set higher that the hardwares possible maximum value
|
||||
* @details The readings are scaled to be 0 ... max.
|
||||
*
|
||||
* @param[in] instance The ID of the dial input instance
|
||||
* @param[in] max The maximum value to be set
|
||||
|
|
57
include/ginput/lld/dial.h
Normal file
57
include/ginput/lld/dial.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
ChibiOS/GFX - Copyright (C) 2012, 2013
|
||||
Joel Bodenmann aka Tectu <joel@unormal.org>
|
||||
|
||||
This file is part of ChibiOS/GFX.
|
||||
|
||||
ChibiOS/GFX is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/GFX is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/**
|
||||
* @file include/ginput/lld/dial.h
|
||||
* @brief GINPUT header file for dial drivers.
|
||||
*
|
||||
* @defgroup Dial Dial
|
||||
* @ingroup GINPUT
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _LLD_GINPUT_DIAL_H
|
||||
#define _LLD_GINPUT_DIAL_H
|
||||
|
||||
#if GINPUT_NEED_DIAL || defined(__DOXYGEN__)
|
||||
|
||||
#include "ginput_lld_dial_config.h"
|
||||
|
||||
typedef void (*DialCallbackFn)(uint16_t instance, uint16_t rawvalue);
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void ginput_lld_dial_init(void);
|
||||
void ginput_lld_dial_poll(DialCallbackFn fn);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GFX_USE_GINPUT && GINPUT_NEED_TOGGLE */
|
||||
|
||||
#endif /* _LLD_GINPUT_TOGGLE_H */
|
||||
/** @} */
|
||||
|
|
@ -92,21 +92,82 @@ typedef struct MouseReading_t {
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Initialise the mouse/touch.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void ginput_lld_mouse_init(void);
|
||||
|
||||
/**
|
||||
* @brief Read the mouse/touch position.
|
||||
*
|
||||
* @param[in] pt A pointer to the structure to fill
|
||||
*
|
||||
* @note For drivers that don't support returning a position
|
||||
* when the touch is up (most touch devices), it should
|
||||
* return the previous position with the new Z value.
|
||||
* The z value is the pressure for those touch devices
|
||||
* that support it (-100 to 100 where > 0 is touched)
|
||||
* or, 0 or 100 for those drivers that don't.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void ginput_lld_mouse_get_reading(MouseReading *pt);
|
||||
|
||||
#if GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE
|
||||
/**
|
||||
* @brief Load calibration data from a storage area on the touch controller.
|
||||
*
|
||||
* @param[in] instance The mouse instance number
|
||||
*
|
||||
* @note The instance parameter is currently always 0 as we only support
|
||||
* one mouse/touch device at a time.
|
||||
* @note This routine should only be provided if the driver has its own
|
||||
* storage area where calibration data can be stored. The drivers
|
||||
* option.h file should define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE = TRUE
|
||||
* if it supports this.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
const char *ginput_lld_mouse_calibration_load(uint16_t instance);
|
||||
/**
|
||||
* @brief Save calibration data to a storage area on the touch controller.
|
||||
*
|
||||
* @param[in] instance The mouse instance number
|
||||
* @param[in] calbuf The calibration data to be saved
|
||||
* @param[in] sz The size of the calibration data
|
||||
*
|
||||
* @note The instance parameter is currently always 0 as we only support
|
||||
* one mouse/touch device at a time.
|
||||
* @note This routine should only be provided if the driver has its own
|
||||
* storage area where calibration data can be stored. The drivers
|
||||
* option.h file should define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE = TRUE
|
||||
* if it supports this.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void ginput_lld_mouse_calibration_save(uint16_t instance, const uint8_t *calbuf, size_t sz);
|
||||
#endif
|
||||
|
||||
/* This routine is provided to low level drivers to wakeup a value read from a thread context.
|
||||
* Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE
|
||||
/**
|
||||
* @brief Wakeup the high level code so that it attempts another read
|
||||
*
|
||||
* @note This routine is provided to low level drivers by the high level code
|
||||
* @note Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void ginputMouseWakeup(void);
|
||||
|
||||
/* This routine is provided to low level drivers to wakeup a value read from an ISR
|
||||
* Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE
|
||||
/**
|
||||
* @brief Wakeup the high level code so that it attempts another read
|
||||
*
|
||||
* @note This routine is provided to low level drivers by the high level code
|
||||
* @note Particularly useful if GINPUT_MOUSE_POLL_PERIOD = TIME_INFINITE
|
||||
*
|
||||
* @icode
|
||||
* @notapi
|
||||
*/
|
||||
void ginputMouseWakeupI(void);
|
||||
|
||||
|
@ -118,4 +179,3 @@ extern "C" {
|
|||
|
||||
#endif /* _LLD_GINPUT_MOUSE_H */
|
||||
/** @} */
|
||||
|
||||
|
|
|
@ -180,30 +180,28 @@ void gwinSetButtonCustom(GHandle gh, GButtonDrawFunction fn, void *param);
|
|||
*/
|
||||
#define gwinGetButtonSource(gh) ((GSourceHandle)(gh))
|
||||
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
/**
|
||||
* @brief Attach a mouse source
|
||||
* @details Attach a mouse source to a given button
|
||||
* @brief Attach a mouse to a button
|
||||
*
|
||||
* @param[in] gh The button handle
|
||||
* @param[in] gsh The source handle
|
||||
* @param[in] instance The mouse instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool_t gwinAttachButtonMouseSource(GHandle gh, GSourceHandle gsh);
|
||||
bool_t gwinAttachButtonMouse(GHandle gh, uint16_t instance);
|
||||
#endif
|
||||
|
||||
#if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
|
||||
/**
|
||||
* @brief Attach a toggle source
|
||||
* @details Attach a toggle source to this button
|
||||
* @brief Attach a toggle to a button
|
||||
*
|
||||
* @param[in] gh The button handle
|
||||
* @param[in] gsh The source handle
|
||||
* @param[in] instance The toggle instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool_t gwinAttachButtonToggleSource(GHandle gh, GSourceHandle gsh);
|
||||
bool_t gwinAttachButtonToggle(GHandle gh, uint16_t instance);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
@ -187,17 +187,30 @@ void gwinSetSliderCustom(GHandle gh, GSliderDrawFunction fn, void *param);
|
|||
*/
|
||||
#define gwinGetSliderSource(gh) ((GSourceHandle)(gh))
|
||||
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
/**
|
||||
* @brief Attach a mouse source
|
||||
* @details Attach a mouse source to a slider
|
||||
* @details Attach a mouse to a slider
|
||||
*
|
||||
* @param[in] gh The slider handle
|
||||
* @param[in] gsh The source handle
|
||||
* @param[in] instance The mouse instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool_t gwinAttachSliderMouseSource(GHandle gh, GSourceHandle gsh);
|
||||
bool_t gwinAttachSliderMouse(GHandle gh, uint16_t instance);
|
||||
#endif
|
||||
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
/**
|
||||
* @brief Attach a dial source
|
||||
* @details Attach a dial to a slider
|
||||
*
|
||||
* @param[in] gh The dial handle
|
||||
* @param[in] instance The dial instance
|
||||
*
|
||||
* @api
|
||||
*/
|
||||
bool_t gwinAttachSliderDial(GHandle gh, uint16_t instance);
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
|
|
@ -22,6 +22,8 @@ FEATURE: SSD1963 rework by username 'fred'
|
|||
FEATURE: Added Picture converter tool
|
||||
FEATURE: Added slider widget
|
||||
FEATURE: Added gwinDraw() routine
|
||||
FEATURE: Added GINPUT Dial support and driver using GADC
|
||||
FEATURE: Simplified assigning inputs to buttons and sliders
|
||||
|
||||
|
||||
*** changes after 1.4 ***
|
||||
|
|
|
@ -30,7 +30,137 @@
|
|||
#include "hal.h"
|
||||
#include "gfx.h"
|
||||
|
||||
#if (GFX_USE_GINPUT && GINPUT_NEED_DIAL) || defined(__DOXYGEN__)
|
||||
#error "GINPUT: GINPUT_NEED_DIAL - Not Implemented Yet"
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
|
||||
#include "ginput/lld/dial.h"
|
||||
|
||||
static GTIMER_DECL(DialTimer);
|
||||
static struct DialStatus_t {
|
||||
uint16_t sensitivity;
|
||||
uint16_t lastvalue;
|
||||
uint16_t max;
|
||||
} DialStatus[GINPUT_DIAL_NUM_PORTS];
|
||||
|
||||
// The reading callback function
|
||||
static void DialCallback(uint16_t instance, uint16_t rawvalue) {
|
||||
struct DialStatus_t *pds;
|
||||
GSourceListener *psl;
|
||||
GEventDial *pe;
|
||||
|
||||
/* Get the information we need */
|
||||
pds = DialStatus+instance;
|
||||
|
||||
/* Range scale - if needed */
|
||||
if (pds->max != GINPUT_DIAL_MAX_VALUE)
|
||||
rawvalue = (uint16_t)((uint32_t)rawvalue * pds->max / GINPUT_DIAL_MAX_VALUE);
|
||||
|
||||
/* Forget about changes below our sensitivity threshold */
|
||||
if (rawvalue >= pds->lastvalue) {
|
||||
if (rawvalue - pds->lastvalue < pds->sensitivity) return;
|
||||
} else {
|
||||
if (pds->lastvalue - rawvalue < pds->sensitivity) return;
|
||||
}
|
||||
|
||||
/* Save the value */
|
||||
pds->lastvalue = rawvalue;
|
||||
|
||||
// Send the event to the listeners that are interested.
|
||||
psl = 0;
|
||||
while ((psl = geventGetSourceListener((GSourceHandle)(DialStatus+instance), psl))) {
|
||||
if (!(pe = (GEventDial *)geventGetEventBuffer(psl)))
|
||||
continue;
|
||||
pe->type = GEVENT_DIAL;
|
||||
pe->instance = instance;
|
||||
pe->value = pds->lastvalue;
|
||||
geventSendEvent(psl);
|
||||
}
|
||||
}
|
||||
|
||||
GSourceHandle ginputGetDial(uint16_t instance) {
|
||||
struct DialStatus_t *pds;
|
||||
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return 0;
|
||||
|
||||
// Do we need to initialise the dial subsystem?
|
||||
if (!gtimerIsActive(&DialTimer)) {
|
||||
for(pds = DialStatus; pds < DialStatus+GINPUT_DIAL_NUM_PORTS; pds++) {
|
||||
pds->max = GINPUT_DIAL_MAX_VALUE;
|
||||
#if GINPUT_DIAL_MAX_VALUE < 100
|
||||
pds->sensitivity = 1;
|
||||
#else
|
||||
pds->sensitivity = GINPUT_DIAL_MAX_VALUE/100;
|
||||
#endif
|
||||
pds->lastvalue = 0;
|
||||
}
|
||||
ginput_lld_dial_init();
|
||||
gtimerStart(&DialTimer, (GTimerFunction)ginput_lld_dial_poll, DialCallback, TRUE, GINPUT_DIAL_POLL_PERIOD);
|
||||
}
|
||||
|
||||
// OK - return this input
|
||||
return (GSourceHandle)(DialStatus+instance);
|
||||
}
|
||||
|
||||
void ginputResetDialRange(uint16_t instance) {
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return;
|
||||
|
||||
ginputSetDialRange(instance, GINPUT_DIAL_MAX_VALUE);
|
||||
}
|
||||
|
||||
uint16_t ginputGetDialRange(uint16_t instance) {
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return 0;
|
||||
|
||||
return DialStatus[instance].max;
|
||||
}
|
||||
|
||||
void ginputSetDialRange(uint16_t instance, uint16_t max) {
|
||||
struct DialStatus_t *pds;
|
||||
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return;
|
||||
|
||||
pds = DialStatus+instance;
|
||||
|
||||
// Rescale the last value and the sensitivity
|
||||
if (max != pds->max) {
|
||||
pds->lastvalue = (uint16_t)((uint32_t)pds->lastvalue * max / pds->max);
|
||||
pds->sensitivity = (uint16_t)((uint32_t)pds->sensitivity * max / pds->max);
|
||||
pds->max = max;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the level change required before a dial even is generated (threshold)
|
||||
* @note This is done after range scaling
|
||||
*
|
||||
* @param[in] instance The ID of the dial input instance
|
||||
* @param[in] diff The amount of level changes
|
||||
*/
|
||||
void ginputSetDialSensitivity(uint16_t instance, uint16_t diff) {
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return;
|
||||
|
||||
DialStatus[instance].sensitivity = diff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the current dial status
|
||||
*
|
||||
* @param[in] instance The ID of the dial input instance
|
||||
* @param[in] pdial The dial event struct
|
||||
*
|
||||
* @return Returns FALSE on an error (eg invalid instance)
|
||||
*/
|
||||
bool_t ginputGetDialStatus(uint16_t instance, GEventDial *pdial) {
|
||||
if (instance >= GINPUT_DIAL_NUM_PORTS)
|
||||
return FALSE;
|
||||
pdial->type = GEVENT_DIAL;
|
||||
pdial->instance = instance;
|
||||
pdial->value = DialStatus[instance].lastvalue;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* GFX_USE_GINPUT && GINPUT_NEED_DIAL */
|
||||
/** @} */
|
||||
|
|
|
@ -68,7 +68,7 @@ static void gwinButtonCallback(void *param, GEvent *pe) {
|
|||
#define pbe ((GEventGWinButton *)pe)
|
||||
|
||||
switch (pe->type) {
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
case GEVENT_MOUSE:
|
||||
case GEVENT_TOUCH:
|
||||
// Ignore anything other than the primary mouse button going up or down
|
||||
|
@ -108,7 +108,7 @@ static void gwinButtonCallback(void *param, GEvent *pe) {
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
|
||||
case GEVENT_TOGGLE:
|
||||
// State has changed - update the button
|
||||
gbw->state = pxe->on ? GBTN_DOWN : GBTN_UP;
|
||||
|
@ -375,18 +375,22 @@ void gwinButtonDraw_Square(GHandle gh, bool_t isdown, const char *txt, const GBu
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
bool_t gwinAttachButtonMouseSource(GHandle gh, GSourceHandle gsh) {
|
||||
if (gh->type != GW_BUTTON)
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
bool_t gwinAttachButtonMouse(GHandle gh, uint16_t instance) {
|
||||
GSourceHandle gsh;
|
||||
|
||||
if (gh->type != GW_BUTTON || !(gsh = ginputGetMouse(instance)))
|
||||
return FALSE;
|
||||
|
||||
return geventAttachSource(&((GButtonObject *)gh)->listener, gsh, GLISTEN_MOUSEMETA);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE
|
||||
bool_t gwinAttachButtonToggleSource(GHandle gh, GSourceHandle gsh) {
|
||||
if (gh->type != GW_BUTTON)
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
|
||||
bool_t gwinAttachButtonToggle(GHandle gh, uint16_t instance) {
|
||||
GSourceHandle gsh;
|
||||
|
||||
if (gh->type != GW_BUTTON || !(gsh = ginputGetToggle(instance)))
|
||||
return FALSE;
|
||||
|
||||
return geventAttachSource(&((GButtonObject *)gh)->listener, gsh, GLISTEN_TOGGLE_OFF|GLISTEN_TOGGLE_ON);
|
||||
|
|
|
@ -39,7 +39,9 @@
|
|||
#define GWIN_SLIDER_DEAD_BAND 5
|
||||
#endif
|
||||
|
||||
static void trackSliderDraw(GHandle gh, coord_t x, coord_t y);
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
static void trackSliderDraw(GHandle gh, coord_t x, coord_t y);
|
||||
#endif
|
||||
|
||||
static const GSliderDrawStyle GSliderDefaultStyle = {
|
||||
HTML2COLOR(0x404040), // color_edge;
|
||||
|
@ -55,10 +57,11 @@ static void gwinSliderCallback(void *param, GEvent *pe) {
|
|||
#define gsw ((GSliderObject *)param)
|
||||
#define gsh ((GSourceHandle)param)
|
||||
#define pme ((GEventMouse *)pe)
|
||||
#define pde ((GEventDial *)pe)
|
||||
#define pse ((GEventGWinSlider *)pe)
|
||||
|
||||
switch (pe->type) {
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
case GEVENT_MOUSE:
|
||||
case GEVENT_TOUCH:
|
||||
// If not tracking we only only interested in a mouse down over the slider
|
||||
|
@ -91,10 +94,10 @@ static void gwinSliderCallback(void *param, GEvent *pe) {
|
|||
// Set the new position
|
||||
if (gh->width < gh->height)
|
||||
gwinSetSliderPosition(gh,
|
||||
(gh->height-1-pme->y+gh->y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min);
|
||||
(uint16_t)((uint32_t)(gh->height-1-pme->y+gh->y-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->height-2*GWIN_SLIDER_DEAD_BAND) + gsw->min));
|
||||
else
|
||||
gwinSetSliderPosition(gh,
|
||||
(pme->x-gh->x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min);
|
||||
(uint16_t)((uint32_t)(pme->x-gh->x-GWIN_SLIDER_DEAD_BAND)*(gsw->max-gsw->min)/(gh->width-2*GWIN_SLIDER_DEAD_BAND) + gsw->min));
|
||||
|
||||
// Update the display
|
||||
gwinSliderDraw(gh);
|
||||
|
@ -109,6 +112,17 @@ static void gwinSliderCallback(void *param, GEvent *pe) {
|
|||
|
||||
return;
|
||||
#endif
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
case GEVENT_DIAL:
|
||||
// Set the new position
|
||||
gwinSetSliderPosition(gh, (uint16_t)((uint32_t)pde->value*(gsw->max-gsw->min)/ginputGetDialRange(pde->instance) + gsw->min));
|
||||
|
||||
// Update the display
|
||||
gwinSliderDraw(gh);
|
||||
|
||||
// Generate the event
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
return;
|
||||
|
@ -194,7 +208,8 @@ void gwinSetSliderStyle(GHandle gh, const GSliderDrawStyle *pStyle) {
|
|||
#undef gsw
|
||||
}
|
||||
|
||||
static void trackSliderDraw(GHandle gh, coord_t x, coord_t y) {
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
static void trackSliderDraw(GHandle gh, coord_t x, coord_t y) {
|
||||
#define gsw ((GSliderObject *)gh)
|
||||
|
||||
#if GDISP_NEED_CLIP
|
||||
|
@ -207,7 +222,8 @@ static void trackSliderDraw(GHandle gh, coord_t x, coord_t y) {
|
|||
gsw->fn(gh, TRUE, y, &gsw->style, gsw->param);
|
||||
|
||||
#undef gbw
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void gwinSliderDraw(GHandle gh) {
|
||||
#define gsw ((GSliderObject *)gh)
|
||||
|
@ -267,15 +283,28 @@ void gwinSliderDraw_Std(GHandle gh, bool_t isVertical, coord_t thumbpos, const G
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE
|
||||
bool_t gwinAttachSliderMouseSource(GHandle gh, GSourceHandle gsh) {
|
||||
if (gh->type != GW_SLIDER)
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
|
||||
bool_t gwinAttachSliderMouse(GHandle gh, uint16_t instance) {
|
||||
GSourceHandle gsh;
|
||||
|
||||
if (gh->type != GW_SLIDER || !(gsh = ginputGetMouse(instance)))
|
||||
return FALSE;
|
||||
|
||||
return geventAttachSource(&((GSliderObject *)gh)->listener, gsh, GLISTEN_MOUSEMETA|GLISTEN_MOUSEDOWNMOVES);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if GFX_USE_GINPUT && GINPUT_NEED_DIAL
|
||||
bool_t gwinAttachSliderDial(GHandle gh, uint16_t instance) {
|
||||
GSourceHandle gsh;
|
||||
|
||||
if (gh->type != GW_SLIDER || !(gsh = ginputGetDial(instance)))
|
||||
return FALSE;
|
||||
|
||||
return geventAttachSource(&((GSliderObject *)gh)->listener, gsh, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* GFX_USE_GWIN && GWIN_NEED_BUTTON */
|
||||
/** @} */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue