Difference between revisions of "GINPUT"
(→Example) |
(→Board file) |
||
Line 13: | Line 13: | ||
static void release_bus(void); | static void release_bus(void); | ||
static uint16_t read_value(uint16_t port); | static uint16_t read_value(uint16_t port); | ||
+ | Examples and a template file can be found under ''/drivers/ginput/touch/xxx/'' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 21:35, 1 July 2014
GINPUT is a powerful module which provides an easy way to interface different hardware peripherals such as touchscreens to the rest of the library. It provides everything which these peripherals need in order to operate properly such as calibration routines for the touchscreens.
Contents
Touchscreen
A touchscreen can be interfaced very easily through the GINPUT module. It doesn't matter if it is a resistive, capacitive or any other touchscreen technology.
Board file
The board file API for the GINPUT touchscreen module looks like the following:
static void init_board(void); static bool_t getpin_pressed(void); static void aquire_bus(void); static void release_bus(void); static uint16_t read_value(uint16_t port); Examples and a template file can be found under ''/drivers/ginput/touch/xxx/''
Calibration
The GINPUT module provides a calibration routine which uses a three-point algorithm. Three calibration points will show up, one after another. You have to press each. At the end of this process, a 4rd one will appear in the center of the screen. This last one is only used to test if the calibration was successful. If the offset is too big, the calibration process will be restarted automatically.
Options
The following settings can alter the behaviour of the calibration routine:
Option | Description |
---|---|
GINPUT_MOUSE_CALIBRATE_EXTREMES | If this is set to TRUE in your gfxconf.h, the calibration points are display at the very corner of the display. This gives an overall more accurate result but they are less intuitive. |
GINPUT_MOUSE_MAX_CALIBRATION_ERROR | This macro is part of the config file of the driver in your board directory and takes a pixel value. It defines how big the pixel offset of the test point can be before the calibration process is repeated automatically. |
Storage interface
An unpleasant problem you might run into with your touchscreen device is, that you have to perform a calibration at every reset. To fight this problem, GINPUT provides an interface to easily save and restore calibration data. The interface is very flexible and you can do with the calibration data what ever you want: You can store it on an SD card, in your MCU's internal flash, on an external I²C EEprom or every other possible way to store 25 bytes.
What you need to do is providing two functions, one to save and one to restore the calibration data:
void mysave(uint16_t instance, const uint8_t *calbuf, size_t sz); const char *myload(uint16_t instance);
These two function are passed to ginputSetMouseCalibrationRoutines()
:
ginputSetMouseCalibrationRoutines(0, mysave, myload, FALSE);
The first parameter is the instance of the mouse device, the second one the save, the third the restore function. The last parameter defines if the buffer allocated by this function to pass the calibration data needs to be free()'d afterwards or not.
It's very important that this function gets called before you call the ginputAttachMouse()
routine.
Example
Here's a simple example which shows how to save and restore the calibration data on an SD-Card using the GFILE module. Please note that this is just for demonstration. It's highly recommended to check the return value of every function.
static void mysave(uint16_t instance, const uint8_t *calbuf, size_t size) { GFILE* f; uint8_t bsize; (void)instance; bsize = (uint8_t)size; f = gfileOpen("calib.gfx", "w"); gfileWrite(f, (void*)&bsize, 1); gfileWrite(f, (void*)calbuf, bsize); gfileClose(f); } static const char *myload(uint16_t instance) { GFILE* f; char* buf; uint8_t bsize; (void)instance; f = gfileOpen("calib.gfx", "r"); gfileRead(f, (void*)&bsize, 1); buf = gfxAlloc(bsize); gfileRead(f, (void*)buf, bsize); gfileClose(f); return buf; }
Digital input
ToDo
Analog input
ToDo