Merge pull request #1 from Tectu/master

Included Tectu changes
This commit is contained in:
Andrew Hannam 2012-11-09 18:47:05 -08:00
commit 0eeb2a2b8f
70 changed files with 3016 additions and 3670 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
docs/html

File diff suppressed because it is too large Load diff

View file

@ -21,7 +21,7 @@
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "touchpad.h"
#include "touchscreen.h"
#define COLOR_SIZE 20
#define PEN_SIZE 20
@ -43,7 +43,7 @@ static const SPIConfig spicfg = {
/* SPI_CR1_BR_2 | */ SPI_CR1_BR_1 | SPI_CR1_BR_0,
};
TOUCHPADDriver TOUCHPADD1 = {
TouchscreenDriver TOUCHPADD1 = {
&SPID1,
&spicfg,
TP_IRQ_PORT,
@ -85,14 +85,14 @@ int main(void) {
chSysInit();
gdispInit();
tpInit(&TOUCHPADD1);
tpCalibrate();
tsInit(&TOUCHPADD1);
tsCalibrate();
drawScreen();
while (TRUE) {
x = tpReadX();
y = tpReadY();
x = tsReadX();
y = tsReadY();
/* inside color box ? */
if(y >= OFFSET && y <= COLOR_SIZE) {

184
docs/rsc/layout.xml Normal file
View file

@ -0,0 +1,184 @@
<doxygenlayout version="1.0">
<!-- Navigation index tabs for HTML output -->
<navindex>
<tab type="mainpage" visible="yes" title=""/>
<tab type="pages" visible="yes" title="" intro=""/>
<tab type="modules" visible="yes" title="" intro=""/>
<tab type="namespaces" visible="yes" title="">
<tab type="namespaces" visible="yes" title="" intro=""/>
<tab type="namespacemembers" visible="yes" title="" intro=""/>
</tab>
<tab type="classes" visible="yes" title="">
<tab type="classes" visible="yes" title="" intro=""/>
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="hierarchy" visible="yes" title="" intro=""/>
<tab type="classmembers" visible="yes" title="" intro=""/>
</tab>
<tab type="files" visible="yes" title="">
<tab type="files" visible="yes" title="" intro=""/>
<tab type="globals" visible="yes" title="" intro=""/>
</tab>
<!--<tab type="dirs" visible="yes" title="" intro=""/>-->
<tab type="examples" visible="yes" title="" intro=""/>
</navindex>
<!-- Layout definition for a class page -->
<class>
<briefdescription visible="no"/>
<detaileddescription title=""/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<inheritancegraph visible="$CLASS_GRAPH"/>
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
<allmemberslink visible="yes"/>
<memberdecl>
<nestedclasses visible="yes" title=""/>
<publictypes title=""/>
<publicslots title=""/>
<signals title=""/>
<publicmethods title=""/>
<publicstaticmethods title=""/>
<publicattributes title=""/>
<publicstaticattributes title=""/>
<protectedtypes title=""/>
<protectedslots title=""/>
<protectedmethods title=""/>
<protectedstaticmethods title=""/>
<protectedattributes title=""/>
<protectedstaticattributes title=""/>
<packagetypes title=""/>
<packagemethods title=""/>
<packagestaticmethods title=""/>
<packageattributes title=""/>
<packagestaticattributes title=""/>
<properties title=""/>
<events title=""/>
<privatetypes title=""/>
<privateslots title=""/>
<privatemethods title=""/>
<privatestaticmethods title=""/>
<privateattributes title=""/>
<privatestaticattributes title=""/>
<friends title=""/>
<related title="" subtitle=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<typedefs title=""/>
<enums title=""/>
<constructors title=""/>
<functions title=""/>
<related title=""/>
<variables title=""/>
<properties title=""/>
<events title=""/>
</memberdef>
<usedfiles visible="$SHOW_USED_FILES"/>
<authorsection visible="yes"/>
</class>
<!-- Layout definition for a namespace page -->
<namespace>
<briefdescription visible="no"/>
<detaileddescription title=""/>
<memberdecl>
<nestednamespaces visible="yes" title=""/>
<classes visible="yes" title=""/>
<typedefs title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<typedefs title=""/>
<enums title=""/>
<functions title=""/>
<variables title=""/>
</memberdef>
<authorsection visible="yes"/>
</namespace>
<!-- Layout definition for a file page -->
<file>
<briefdescription visible="no"/>
<detaileddescription title=""/>
<includes visible="$SHOW_INCLUDE_FILES"/>
<includegraph visible="$INCLUDE_GRAPH"/>
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
<sourcelink visible="yes"/>
<memberdecl>
<classes visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<functions title=""/>
<variables title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<membergroups visible="yes"/>
</memberdecl>
<memberdef>
<functions title=""/>
<variables title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
</memberdef>
<authorsection/>
</file>
<!-- Layout definition for a group page -->
<group>
<briefdescription visible="no"/>
<groupgraph visible="$GROUP_GRAPHS"/>
<detaileddescription title=""/>
<memberdecl>
<classes visible="yes" title=""/>
<namespaces visible="yes" title=""/>
<dirs visible="yes" title=""/>
<nestedgroups visible="yes" title=""/>
<files visible="yes" title=""/>
<functions title=""/>
<variables title=""/>
<membergroups visible="yes"/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<enumvalues title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
</memberdecl>
<memberdef>
<pagedocs/>
<functions title=""/>
<variables title=""/>
<defines title=""/>
<typedefs title=""/>
<enums title=""/>
<enumvalues title=""/>
<signals title=""/>
<publicslots title=""/>
<protectedslots title=""/>
<privateslots title=""/>
<events title=""/>
<properties title=""/>
<friends title=""/>
</memberdef>
<authorsection visible="yes"/>
</group>
<!-- Layout definition for a directory page -->
<directory>
<briefdescription visible="no"/>
<directorygraph visible="yes"/>
<detaileddescription title=""/>
<memberdecl>
<dirs visible="yes"/>
<files visible="yes"/>
</memberdecl>
</directory>
</doxygenlayout>

28
docs/src/console.dox Normal file
View file

@ -0,0 +1,28 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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/>.
*/
/**
* @addtogroup CONSOLE
* @details The CONSOLE module provides a BaseSequentialStream abstraction.
* It allows to easily use an LCD to output any generic data, for
* example by using the chprintf() provided by ChibiOS/RT.
* @details Read more here: http://chibios-gfx.com/documentation/console
*/

26
docs/src/gdisp.dox Normal file
View file

@ -0,0 +1,26 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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/>.
*/
/**
* @addtogroup GDISP
* @details The GDISP module provides high level abstraction to interface
* pixel oriented graphic displays.
*/

28
docs/src/graph.dox Normal file
View file

@ -0,0 +1,28 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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/>.
*/
/**
* @addtogroup GRAPH
* @details The GRAPH module provides high level HAL independed routines
* to draw graphs on a graphic display. The graph is highly
* configurable. There are many options to controll the look
* of the graph.
*/

27
docs/src/gwin.dox Normal file
View file

@ -0,0 +1,27 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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/>.
*/
/**
* @addtogroup GWIN
* @details The GWIN module provides simple window management.
* @details Please note that GWIN is a module ontop of GDISP. Therefore, GDISP
* has to be set up correctly.
*/

View file

@ -1,5 +1,5 @@
/*
ChibiOS/GFX - Copyright (C) 2012
/*
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
@ -19,26 +19,19 @@
*/
/**
* @file touchpadADS7843/touchpad_lld_config.h
* @brief Touchpad Driver subsystem low level driver.
* @mainpage ChibiOS/GFX
* @author Joel Bodenmann (joel@unormal.org).
*
* @addtogroup TOUCHPAD
* @{
* <h2>ChibiOS/GFX</h2>
* ChibiOS/GFX is an official add-on library for ChibiOS/RT to
* interface all different types of LCDs and touchscreens.
*
* <h2>Features</h2>
* - Modular design to reduce memory footprint
* - HAL abstractions allows it to easily write new drivers
* - Completely written in C, usable in C++ without any modifications
* - Supports hardware accelerated drawing by LCDs
* - Very flexible interfaces for calibration storage and more
* - We are having our own homepage: http://chibios-gfx.com
*/
#ifndef _TOUCHPAD_LLD_CONFIG_H
#define _TOUCHPAD_LLD_CONFIG_H
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver hardware support. */
/*===========================================================================*/
#define TOUCHPAD_HAS_IRQ TRUE
#define TOUCHPAD_HAS_PRESSURE FALSE
#endif /* GFX_USE_TOUCHPAD */
#endif /* _TOUCHPAD_LLD_CONFIG_H */
/** @} */

26
docs/src/touchscreen.dox Normal file
View file

@ -0,0 +1,26 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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/>.
*/
/**
* @addtogroup TOUCHSCREEN
* @details The TOUCHSCREEN module provides high level abstraction to interface
* touchscreens.
*/

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispNokia6610/gdisp_lld.c
* @file drivers/gdisp/Nokia6610/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for the Nokia6610 display.
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
@ -448,7 +448,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @detail Unsupported control codes are ignored.
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispNokia6610/gdisp_lld_board_example.h
* @file drivers/gdisp/Nokia6610/gdisp_lld_board_example.h
* @brief GDISP Graphic Driver subsystem board interface for the Nokia6610 display.
*
* @addtogroup GDISP

View file

@ -23,7 +23,7 @@
#endif
/**
* @file gdispNokia6610/gdisp_lld_board_olimexsam7ex256.h
* @file drivers/gdisp/Nokia6610/gdisp_lld_board_olimexsam7ex256.h
* @brief GDISP Graphic Driver subsystem board interface for the Olimex SAM7-EX256 board.
*
* @addtogroup GDISP

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispNokia6610/gdisp_lld_config.h
* @file drivers/gdisp/Nokia6610/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 display.
*
* @addtogroup GDISP
@ -29,7 +29,7 @@
#ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP
#if GFX_USE_GDISP
/*===========================================================================*/
/* Driver hardware support. */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispS6d1121/gdisp_lld.c
* @file drivers/gdisp/S6D1121/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for the S6d1121 display.
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
@ -411,7 +411,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @detail Unsupported control codes are ignored.
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t
@ -501,3 +501,4 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispS6d1121/gdisp_lld_config.h
* @file drivers/gdisp/S6D1121/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header for the S6d1121 display.
*
* @addtogroup GDISP
@ -51,3 +51,4 @@
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View file

@ -1,5 +1,5 @@
/*
ChibiOS/RT - Copyright (C) 2012
ChibiOS/GFX - Copyright (C) 2012
Joel Bodenmann aka Tectu <joel@unormal.org>
This file is part of ChibiOS/GFX.
@ -251,3 +251,4 @@ static void lld_lcdResetViewPort(void) {
}
#endif /* S6D1121_H */

View file

@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
@ -385,7 +385,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if (GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL) || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @detail Unsupported control codes are ignored.
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t

View file

@ -19,7 +19,7 @@
*/
/**
* @file SSD1963/gdisp_lld.c
* @file drivers/gdisp/SSD1963/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source.
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
@ -511,7 +511,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if (GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL) || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @detail Unsupported control codes are ignored.
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t

View file

@ -19,7 +19,7 @@
*/
/**
* @file SSD1963/gdisp_lld_config.h
* @file drivers/gdisp/SSD1963/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header.
*
* @addtogroup GDISP
@ -29,7 +29,7 @@
#ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP
/*===========================================================================*/
/* Driver hardware support. */
@ -50,3 +50,4 @@
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View file

@ -18,14 +18,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file SSD1963/ssd1963.h
* @brief SSD1963 specific data.
*
* @addtogroup GDISP
* @{
*/
#ifndef SSD1963_H
#define SSD1963_H
@ -138,4 +130,4 @@
#define SSD1963_GET_PIXEL_DATA_INTERFACE 0x00F1
#endif
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispTestStub/gdisp_lld.c
* @file drivers/gdisp/TestStub/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source (stub).
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispTestStub/gdisp_lld_config.h
* @file drivers/gdisp/TestStub/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header (stub).
*
* @addtogroup GDISP

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispVMT/gdisp_lld.c
* @file drivers/gdisp/VMT/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for VMT.
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define GDISP_LLD_NO_STRUCT
@ -279,3 +279,4 @@ bool_t gdisp_lld_init_VMT(void) {
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispVMT/gdisp_lld_config.h
* @file drivers/gdisp/VMT/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header template.
*
* @addtogroup GDISP
@ -68,3 +68,4 @@
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispVMT/gdisp_lld.c
* @file drivers/gdisp/VMT/gdisp_lld_driver1.c
* @brief GDISP Graphics Driver subsystem low level driver source for VMT.
*
* @addtogroup GDISP
@ -29,7 +29,7 @@
#include "ch.h"
#include "hal.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define CONFIGFILE() <../GDISP_VMT_NAME1()/gdisp_lld_config.h>
#define DRIVERFILE() <../GDISP_VMT_NAME1()/gdisp_lld.c>
@ -49,3 +49,4 @@
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdispVMT/gdisp_lld.c
* @file drivers/gdisp/VMT/gdisp_lld_driver2.c
* @brief GDISP Graphics Driver subsystem low level driver source for VMT.
*
* @addtogroup GDISP
@ -29,7 +29,7 @@
#include "ch.h"
#include "hal.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
#define CONFIGFILE() <../GDISP_VMT_NAME2()/gdisp_lld_config.h>
#define DRIVERFILE() <../GDISP_VMT_NAME2()/gdisp_lld.c>
@ -49,3 +49,4 @@
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file Win32/gdisp_lld.c
* @file drivers/gdisp/Win32/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source for Win32.
*
* @addtogroup GDISP
@ -30,7 +30,7 @@
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
@ -443,3 +443,4 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file Win32/gdisp_lld_config.h
* @file drivers/gdisp/Win32/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header for Win32.
*
* @addtogroup GDISP
@ -29,7 +29,7 @@
#ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP || defined(__DOXYGEN__)
#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/
/*===========================================================================*/
/* Driver hardware support. */
@ -50,3 +50,4 @@
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View file

@ -1,8 +0,0 @@
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_TOUCHPAD TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/touchpadADS7843/touchpad_lld.mk

View file

@ -1,6 +0,0 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/touchpad/ADS7843/touchpad_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/touchpad/ADS7843

View file

@ -1,8 +0,0 @@
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_TOUCHPAD TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/touchpad/XPT2046/touchpad_lld.mk

View file

@ -1,6 +0,0 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/touchpad/XPT2046/touchpad_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/touchpad/XPT2046

View file

@ -0,0 +1,8 @@
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_TOUCHSCREEN TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/touchscreen/ADS7843/touchscreen_lld.mk

View file

@ -19,18 +19,18 @@
*/
/**
* @file touchpadXPT2046/touchpad_lld.c
* @brief Touchpad Driver subsystem low level driver source.
* @file drivers/touchscreen/ADS7843/touchscreen_lld.c
* @brief Touchscreen Driver subsystem low level driver source.
*
* @addtogroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#include "ch.h"
#include "hal.h"
#include "touchpad.h"
#include "touchscreen.h"
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if GFX_USE_TOUCHSCREEN /*|| defined(__DOXYGEN__)*/
/*===========================================================================*/
/* Driver local definitions. */
@ -44,8 +44,8 @@
/* Driver local variables. */
/*===========================================================================*/
#if !defined(__DOXYGEN__)
/* Local copy of the current touchpad driver */
static const TOUCHPADDriver *tpDriver;
/* Local copy of the current touchscreen driver */
static const TouchscreenDriver *tsDriver;
static uint16_t sampleBuf[7];
#endif
@ -65,22 +65,24 @@
/* ---- Required Routines ---- */
/**
* @brief Low level Touchpad driver initialization.
* @brief Low level touchscreen driver initialization.
*
* @param[in] ts The touchscreen driver
*
* @notapi
*/
void tp_lld_init(const TOUCHPADDriver *tp) {
tpDriver = tp;
void ts_lld_init(const TouchscreenDriver *ts) {
tsDriver = ts;
if(tpDriver->direct_init)
spiStart(tpDriver->spip, tpDriver->spicfg);
if(tsDriver->direct_init)
spiStart(tsDriver->spip, tsDriver->spicfg);
}
/**
* @brief Reads a conversion from the touchpad
* @brief Reads a conversion from the touchscreen
*
* @param[in] cmd The command bits to send to the touchpad
* @param[in] cmd The command bits to send to the touchscreen
*
* @return The read value 12-bit right-justified
*
@ -89,14 +91,14 @@ void tp_lld_init(const TOUCHPADDriver *tp) {
*
* @notapi
*/
uint16_t tp_lld_read_value(uint8_t cmd) {
uint16_t ts_lld_read_value(uint8_t cmd) {
static uint8_t txbuf[3] = {0};
static uint8_t rxbuf[3] = {0};
uint16_t ret;
txbuf[0] = cmd;
spiExchange(tpDriver->spip, 3, txbuf, rxbuf);
spiExchange(tsDriver->spip, 3, txbuf, rxbuf);
ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3);
@ -104,18 +106,18 @@ uint16_t tp_lld_read_value(uint8_t cmd) {
}
/**
* @brief 7-point median filtering code for touchpad samples
* @brief 7-point median filtering code for touchscreen samples
*
* @note This is an internally used routine only.
*
* @notapi
*/
static void tp_lld_filter(void) {
static void ts_lld_filter(void) {
uint16_t temp;
int i,j;
for(i = 0; i < 4; i++) {
for(j=i; j < 7; j++) {
for(j = i; j < 7; j++) {
if(sampleBuf[i] > sampleBuf[j]) {
/* Swap the values */
temp = sampleBuf[i];
@ -133,37 +135,37 @@ static void tp_lld_filter(void) {
*
* @notapi
*/
uint16_t tp_lld_read_x(void) {
uint16_t ts_lld_read_x(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
spiAcquireBus(tsDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHSCREEN_SPI_PROLOGUE();
palClearPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0xD1);
ts_lld_read_value(0xD1);
for(i = 0; i < 7; i++) {
sampleBuf[i]=tp_lld_read_value(0xD1);
sampleBuf[i] = ts_lld_read_value(0xD1);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0xD0);
ts_lld_read_value(0xD0);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
palSetPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
TOUCHSCREEN_SPI_EPILOGUE();
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiReleaseBus(tpDriver->spip);
spiReleaseBus(tsDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
ts_lld_filter();
return sampleBuf[3];
}
@ -173,43 +175,43 @@ uint16_t tp_lld_read_x(void) {
*
* @notapi
*/
uint16_t tp_lld_read_y(void) {
uint16_t ts_lld_read_y(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
spiAcquireBus(tsDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHSCREEN_SPI_PROLOGUE();
palClearPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0x91);
ts_lld_read_value(0x91);
for(i = 0; i < 7; i++) {
sampleBuf[i] = tp_lld_read_value(0x91);
sampleBuf[i] = ts_lld_read_value(0x91);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0x90);
ts_lld_read_value(0x90);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
palSetPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
TOUCHSCREEN_SPI_EPILOGUE();
#ifdef SPI_USE_MUTUAL_EXCLUSION
spiReleaseBus(tpDriver->spip);
spiReleaseBus(tsDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
ts_lld_filter();
return sampleBuf[3];
}
/* ---- Optional Routines ---- */
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
#if TOUCHSCREEN_HAS_IRQ || defined(__DOXYGEN__)
/*
* @brief for checking if touchpad is pressed or not.
*
@ -217,23 +219,23 @@ uint16_t tp_lld_read_y(void) {
*
* @notapi
*/
uint8_t tp_lld_irq(void) {
return (!palReadPad(tpDriver->tpIRQPort, tpDriver->tpIRQPin));
uint8_t ts_lld_irq(void) {
return (!palReadPad(tsDriver->tsIRQPort, tsDriver->tsIRQPin));
}
#endif
#if TOUCHPAD_HAS_PRESSURE || defined(__DOXYGEN__)
#if TOUCHSCREEN_HAS_PRESSURE || defined(__DOXYGEN__)
/*
* @brief Reads out the Z direction / pressure.
*
* @notapi
*/
uint16_t tp_lld_read_z(void) {
uint16_t ts_lld_read_z(void) {
/* ToDo */
return 42;
}
#endif
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
/** @} */

View file

@ -0,0 +1,6 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/touchscreen/ADS7843/touchscreen_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/touchscreen/ADS7843

View file

@ -19,26 +19,27 @@
*/
/**
* @file touchpadXPT2046/touchpad_lld_config.h
* @brief Touchppad Driver subsystem low level driver.
* @file drivers/touchscreen/ADS7843/touchscreen_lld_config.h
* @brief Touchscreen Driver subsystem low level driver.
*
* @addtogroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef _TOUCHPAD_LLD_CONFIG_H
#define _TOUCHPAD_LLD_CONFIG_H
#ifndef TOUCHSCREEN_LLD_CONFIG_H
#define TOUCHSCREEN_LLD_CONFIG_H
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if GFX_USE_TOUCHSCREEN /*|| defined(__DOXYGEN__)*/
/*===========================================================================*/
/* Driver hardware support. */
/*===========================================================================*/
#define TOUCHPAD_HAS_IRQ TRUE
#define TOUCHPAD_HAS_PRESSURE TRUE
#define TOUCHSCREEN_HAS_IRQ TRUE
#define TOUCHSCREEN_HAS_PRESSURE FALSE
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* _TOUCHPAD_LLD_CONFIG_H */
#endif /* TOUCHSCREEN_LLD_CONFIG_H */
/** @} */

View file

@ -0,0 +1,8 @@
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_TOUCHSCREEN TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/touchscreen/XPT2046/touchscreen_lld.mk

View file

@ -19,18 +19,18 @@
*/
/**
* @file touchpadXPT2046/touchpad_lld.c
* @brief Touchpad Driver subsystem low level driver source.
* @file drivers/touchscreen/XPT2046/touchscreen_lld.c
* @brief Touchscreen Driver subsystem low level driver source.
*
* @addtogroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#include "ch.h"
#include "hal.h"
#include "touchpad.h"
#include "touchscreen.h"
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if GFX_USE_TOUCHSCREEN /*|| defined(__DOXYGEN__)*/
/*===========================================================================*/
/* Driver local definitions. */
@ -45,7 +45,7 @@
/*===========================================================================*/
#if !defined(__DOXYGEN__)
/* Local copy of the current touchpad driver */
static const TOUCHPADDriver *tpDriver;
static const TouchscreenDriver *tsDriver;
static uint16_t sampleBuf[7];
#endif
@ -65,22 +65,24 @@
/* ---- Required Routines ---- */
/**
* @brief Low level Touchpad driver initialization.
* @brief Low level Touchscreen driver initialization.
*
* @param[in] ts The touchscreen driver struct
*
* @notapi
*/
void tp_lld_init(const TOUCHPADDriver *tp) {
tpDriver = tp;
void ts_lld_init(const TouchscreenDriver *ts) {
tsDriver = ts;
if(tpDriver->direct_init)
spiStart(tpDriver->spip, tpDriver->spicfg);
if(tsDriver->direct_init)
spiStart(tsDriver->spip, tsDriver->spicfg);
}
/**
* @brief Reads a conversion from the touchpad
* @brief Reads a conversion from the touchscreen
*
* @param[in] cmd The command bits to send to the touchpad
* @param[in] cmd The command bits to send to the touchscreen
*
* @return The read value 12-bit right-justified
*
@ -89,14 +91,14 @@ void tp_lld_init(const TOUCHPADDriver *tp) {
*
* @notapi
*/
uint16_t tp_lld_read_value(uint8_t cmd) {
uint16_t ts_lld_read_value(uint8_t cmd) {
static uint8_t txbuf[3] = {0};
static uint8_t rxbuf[3] = {0};
uint16_t ret;
txbuf[0] = cmd;
spiExchange(tpDriver->spip, 3, txbuf, rxbuf);
spiExchange(tsDriver->spip, 3, txbuf, rxbuf);
ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3);
@ -104,18 +106,18 @@ uint16_t tp_lld_read_value(uint8_t cmd) {
}
/**
* @brief 7-point median filtering code for touchpad samples
* @brief 7-point median filtering code for touchscreen samples
*
* @note This is an internally used routine only.
*
* @notapi
*/
static void tp_lld_filter(void) {
static void ts_lld_filter(void) {
uint16_t temp;
int i,j;
for(i = 0; i < 4; i++) {
for(j=i; j < 7; j++) {
for(j = i; j < 7; j++) {
if(sampleBuf[i] > sampleBuf[j]) {
/* Swap the values */
temp = sampleBuf[i];
@ -133,37 +135,37 @@ static void tp_lld_filter(void) {
*
* @notapi
*/
uint16_t tp_lld_read_x(void) {
uint16_t ts_lld_read_x(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
spiAcquireBus(tsDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHSCREEN_SPI_PROLOGUE();
palClearPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0xD1);
ts_lld_read_value(0xD1);
for(i = 0; i < 7; i++) {
sampleBuf[i]=tp_lld_read_value(0xD1);
sampleBuf[i] = ts_lld_read_value(0xD1);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0xD0);
ts_lld_read_value(0xD0);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
palSetPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
TOUCHSCREEN_SPI_EPILOGUE();
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiReleaseBus(tpDriver->spip);
spiReleaseBus(tsDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
ts_lld_filter();
return sampleBuf[3];
}
@ -173,67 +175,67 @@ uint16_t tp_lld_read_x(void) {
*
* @notapi
*/
uint16_t tp_lld_read_y(void) {
uint16_t ts_lld_read_y(void) {
int i;
#if defined(SPI_USE_MUTUAL_EXCLUSION)
spiAcquireBus(tpDriver->spip);
spiAcquireBus(tsDriver->spip);
#endif
TOUCHPAD_SPI_PROLOGUE();
palClearPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHSCREEN_SPI_PROLOGUE();
palClearPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
/* Discard the first conversion - very noisy and keep the ADC on hereafter
* till we are done with the sampling. Note that PENIRQ is disabled.
*/
tp_lld_read_value(0x91);
ts_lld_read_value(0x91);
for(i = 0; i < 7; i++) {
sampleBuf[i] = tp_lld_read_value(0x91);
sampleBuf[i] = ts_lld_read_value(0x91);
}
/* Switch on PENIRQ once again - perform a dummy read */
tp_lld_read_value(0x90);
ts_lld_read_value(0x90);
palSetPad(tpDriver->spicfg->ssport, tpDriver->spicfg->sspad);
TOUCHPAD_SPI_EPILOGUE();
palSetPad(tsDriver->spicfg->ssport, tsDriver->spicfg->sspad);
TOUCHSCREEN_SPI_EPILOGUE();
#ifdef SPI_USE_MUTUAL_EXCLUSION
spiReleaseBus(tpDriver->spip);
spiReleaseBus(tsDriver->spip);
#endif
/* Find the median - use selection sort */
tp_lld_filter();
ts_lld_filter();
return sampleBuf[3];
}
/* ---- Optional Routines ---- */
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
#if TOUCHSCREEN_HAS_IRQ || defined(__DOXYGEN__)
/*
* @brief for checking if touchpad is pressed or not.
* @brief for checking if touchscreen is pressed or not.
*
* @return 1 if pressed / 0 if not pressed
*
* @notapi
*/
uint8_t tp_lld_irq(void) {
return (!palReadPad(tpDriver->tpIRQPort, tpDriver->tpIRQPin));
uint8_t ts_lld_irq(void) {
return (!palReadPad(tsDriver->tsIRQPort, tsDriver->tsIRQPin));
}
#endif
#if TOUCHPAD_HAS_PRESSURE || defined(__DOXYGEN__)
#if TOUCHSCREEN_HAS_PRESSURE || defined(__DOXYGEN__)
/*
* @brief Reads out the Z direction / pressure.
*
* @notapi
*/
uint16_t tp_lld_read_z(void) {
uint16_t ts_lld_read_z(void) {
/* ToDo */
return 42;
}
#endif
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
/** @} */

View file

@ -0,0 +1,6 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/touchscreen/XPT2046/touchscreen_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/touchscreen/XPT2046

View file

@ -19,27 +19,27 @@
*/
/**
* @file touchpadXPT2046/touchpad_lld_config.h
* @brief Touchppad Driver subsystem low level driver.
* @file drivers/touchscreen/XPT2046/touchscreen_lld_config.h
* @brief Touchscreen Driver subsystem low level driver.
*
* @addtogroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef _TOUCHPAD_LLD_CONFIG_H
#define _TOUCHPAD_LLD_CONFIG_H
#ifndef TOUCHSCREEN_LLD_CONFIG_H
#define TOUCHSCREEN_LLD_CONFIG_H
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if GFX_USE_TOUCHSCREEN /*|| defined(__DOXYGEN__)*/
/*===========================================================================*/
/* Driver hardware support. */
/*===========================================================================*/
#define TOUCHPAD_HAS_IRQ TRUE
#define TOUCHPAD_HAS_PRESSURE TRUE
#define TOUCHSCREEN_HAS_IRQ TRUE
#define TOUCHSCREEN_HAS_PRESSURE TRUE
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* _TOUCHPAD_LLD_CONFIG_H */
#endif /* TOUCHSCREEN_LLD_CONFIG_H */
/** @} */

2
gfx.mk
View file

@ -6,7 +6,7 @@ endif
GFXSRC += $(GFXLIB)/src/gdisp.c \
$(GFXLIB)/src/gdisp_fonts.c \
$(GFXLIB)/src/gwin.c \
$(GFXLIB)/src/touchpad.c \
$(GFXLIB)/src/touchscreen.c \
$(GFXLIB)/src/console.c \
$(GFXLIB)/src/graph.c \

View file

@ -18,6 +18,14 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/console.h
* @brief CONSOLE header file.
*
* @addtogroup CONSOLE
* @{
*/
#ifndef CONSOLE_H
#define CONSOLE_H
@ -81,4 +89,5 @@ msg_t gfxConsoleWrite(GConsole *console, const uint8_t *bp, size_t n);
#endif /* GFX_USE_CONSOLE */
#endif /* CONSOLE_H */
/** @} */

View file

@ -17,13 +17,15 @@
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 gdisp.h
* @file include/gdisp.h
* @brief GDISP Graphic Driver subsystem header file.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_H
#define _GDISP_H
@ -317,3 +319,4 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
#endif /* _GDISP_H */
/** @} */

View file

@ -767,3 +767,4 @@ void *GDISP_LLD(query)(unsigned what) {
#endif /* GFX_USE_GDISP */
#endif /* GDISP_EMULATION_C */

View file

@ -17,8 +17,9 @@
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 gdisp_fonts.h
* @file include/gdisp_fonts.h
* @brief GDISP internal font definitions.
* @details This is not generally needed by an application. It is used
* by the low level drivers that need to understand a font.
@ -88,3 +89,4 @@ struct font {
#endif /* _GDISP_FONTS_H */
/** @} */

View file

@ -17,8 +17,9 @@
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 gdisp_lld.h
* @file include/gdisp_lld.h
* @brief GDISP Graphic Driver subsystem low level driver header.
*
* @addtogroup GDISP
@ -146,7 +147,7 @@
/**
* @brief Driver Control Constants
* @detail Unsupported control codes are ignored.
* @details Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t
@ -166,7 +167,7 @@
/**
* @brief Driver Query Constants
* @detail Unsupported query codes return (void *)-1.
* @details Unsupported query codes return (void *)-1.
* @note There are some predefined and some specific to the low level driver.
* @note The result should be typecast the required type.
* @note GDISP_QUERY_WIDTH - Gets the width of the screen
@ -398,7 +399,7 @@
* GDISP_PIXELFORMAT_RGB666
* GDISP_PIXELFORMAT_CUSTOM
* @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills
* you need to also define @P gdispPackPixels(buf,cx,x,y,c)
* you need to also define @p gdispPackPixels(buf,cx,x,y,c)
* @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel
* format must not be a packed format as the software blit does
* not support packed pixels
@ -648,3 +649,4 @@ extern "C" {
#endif /* _GDISP_LLD_H */
/** @} */

View file

@ -17,8 +17,9 @@
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 gdisp_lld_msgs.h
* @file include/gdisp_lld_msgs.h
* @brief GDISP Graphic Driver subsystem low level driver message structures.
*
* @addtogroup GDISP
@ -191,3 +192,4 @@ typedef union gdisp_lld_msg {
#endif /* GFX_USE_GDISP */
#endif /* _GDISP_LLD_MSGS_H */
/** @} */

View file

@ -18,6 +18,14 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file include/graph.h
* @brief GRAPH module header file.
*
* @addtogroup GRAPH
* @{
*/
#ifndef GRAPH_H
#define GRAPH_H
@ -25,7 +33,11 @@
#define GFX_USE_GRAPH FALSE
#endif
#if GFX_USE_GRAPH
#if GFX_USE_GRAPH || defined(__DOXYGEN__)
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
typedef struct _Graph {
coord_t origin_x;
@ -52,6 +64,10 @@ typedef struct _Graph {
extern "C" {
#endif
/*===========================================================================*/
/* Type definitions */
/*===========================================================================*/
void graphDrawSystem(Graph *g);
void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color);
void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
@ -64,4 +80,5 @@ void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, u
#endif /* GFX_USE_GRAPH */
#endif
/** @} */

View file

@ -19,16 +19,17 @@
*/
/**
* @file touchpad.h
* @brief TOUCHPAD Touchpad Driver subsystem header file.
* @file include/touchscreen.h
* @brief TOUCHSCREEN Touchscreen driver subsystem header file.
*
* @addgroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef _TOUCHPAD_H
#define _TOUCHPAD_H
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#ifndef TOUCHSCREEN_H
#define TOUCHSCREEN_H
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
/**
* @brief specifies how many conversions are made for a readout.
@ -46,7 +47,10 @@
/*===========================================================================*/
/* Include the low level driver information */
#include "touchpad_lld.h"
#include "touchscreen_lld.h"
/* For definitions of coord_t, we require gdisp.h */
#include "gdisp.h"
/*===========================================================================*/
/* Type definitions */
@ -56,10 +60,12 @@
* @brief Struct used for calibration
*/
typedef struct cal_t {
float xm;
float ym;
float xn;
float yn;
float ax;
float bx;
float cx;
float ay;
float by;
float cy;
} cal_t;
/*===========================================================================*/
@ -70,25 +76,25 @@ typedef struct cal_t {
extern "C" {
#endif
void tpInit(const TOUCHPADDriver *tp);
uint16_t tpReadX(void);
uint16_t tpReadY(void);
void tpCalibrate(void);
void tsInit(const TouchscreenDriver *ts);
coord_t tsReadX(void);
coord_t tsReadY(void);
void tsCalibrate(void);
#if TOUCHPAD_HAS_IRQ
uint8_t tpIRQ(void);
#if TOUCHSCREEN_HAS_IRQ
bool_t tsIRQ(void);
#endif
#if TOUCHPAD_HAS_PRESSURE
uint16_t tpReadZ(void);
#if TOUCHSCREEN_HAS_PRESSURE
uint16_t tsReadZ(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* _TOUCHPAD_H */
#endif /* TOUCHSCREEN_H */
/** @} */

View file

@ -19,54 +19,58 @@
*/
/**
* @file touchpad_lld.h
* @brief TOUCHPAD Driver subsystem low level driver header.
* @file include/touchscreen_lld.h
* @brief TOUCHSCREEN Driver subsystem low level driver header.
*
* @addgroup TOUCHPAD
* @addtogroup TOUCHSCREEN
* @{
*/
#ifndef _TOUCHPAD_LLD_H
#define _TOUCHPAD_LLD_H
#ifndef TOUCHSCREEN_LLD_H
#define TOUCHSCREEN_LLD_H
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
/*===========================================================================*/
/* Include the low level driver configuration information */
/*===========================================================================*/
#include "touchpad_lld_config.h"
#include "touchscreen_lld_config.h"
/*===========================================================================*/
/* Error checks. */
/*===========================================================================*/
#ifndef TOUCHPAD_NEED_MULTITHREAD
#define TOUCHPAD_NEED_MULTITHREAD FALSE
#ifndef TOUCHSCREEN_NEED_MULTITHREAD
#define TOUCHSCREEN_NEED_MULTITHREAD FALSE
#endif
#ifndef TOUCHPAD_XY_INVERTED
#define TOUCHPAD_XY_INVERTED FALSE
#ifndef TOUCHSCREEN_XY_INVERTED
#define TOUCHSCREEN_XY_INVERTED FALSE
#endif
#ifndef TOUCHPAD_STORE_CALIBRATION
#define TOUCHPAD_STORE_CALIBRATION FALSE
#ifndef TOUCHSCREEN_STORE_CALIBRATION
#define TOUCHSCREEN_STORE_CALIBRATION FALSE
#endif
#ifndef TOUCHPAD_HAS_IRQ
#define TOUCHPAD_HAS_IRQ FALSE
#ifndef TOUCHSCREEN_VERIFY_CALIBRATION
#define TOUCHSCREEN_VERIFY_CALIBRATION FALSE
#endif
#ifndef TOUCHPAD_HAS_PRESSURE
#define TOUCHPAD_HAS_PRESSURE FALSE
#ifndef TOUCHSCREEN_HAS_IRQ
#define TOUCHSCREEN_HAS_IRQ FALSE
#endif
#ifndef TOUCHPAD_SPI_PROLOGUE
#define TOUCHPAD_SPI_PROLOGUE()
#ifndef TOUCHSCREEN_HAS_PRESSURE
#define TOUCHSCREEN_HAS_PRESSURE FALSE
#endif
#ifndef TOUCHPAD_SPI_EPILOGUE
#define TOUCHPAD_SPI_EPILOGUE()
#ifndef TOUCHSCREEN_SPI_PROLOGUE
#define TOUCHSCREEN_SPI_PROLOGUE()
#endif
#ifndef TOUCHSCREEN_SPI_EPILOGUE
#define TOUCHSCREEN_SPI_EPILOGUE()
#endif
/*===========================================================================*/
@ -74,9 +78,9 @@
/*===========================================================================*/
/**
* @brief Structure representing a Touchpad driver.
* @brief Structure representing a touchscreen driver.
*/
typedef struct _TOUCHPADDriver {
typedef struct TouchscreenDriver {
/*
* @brief Pointer to SPI driver.
* @note SPI driver must be enabled in mcuconf.h and halconf.h
@ -93,27 +97,27 @@ typedef struct _TOUCHPADDriver {
/*
* @brief Touchscreen controller TPIRQ pin GPIO port
*/
ioportid_t tpIRQPort;
ioportid_t tsIRQPort;
/*
* @brief Touchscreen controller TPIRQ GPIO pin
* @note The interface is polled as of now, interrupt support is
* to be implemented in the future.
*/
ioportmask_t tpIRQPin;
ioportmask_t tsIRQPin;
/*
* @brief Initialize the SPI with the configuration struct given or not
* If TRUE, spiStart is called by the init, otherwise not
* @note This is provided in such a case when SPI port is being shared
* across multiple peripherals, so not to disturb the SPI bus.
* You can use TOUCHPAD_SPI_PROLOGUE() and TOUCHPAD_SPI_EPILOGUE()
* You can use TOUCHSCREEN_SPI_PROLOGUE() and TOUCHSCREEN_SPI_EPILOGUE()
* macros to change the SPI configuration or speed before and
* after using the touchpad. An example case would be sharing the
* bus with a fast flash memory chip.
*/
bool_t direct_init;
} TOUCHPADDriver;
} TouchscreenDriver;
/*===========================================================================*/
@ -126,26 +130,26 @@ extern "C" {
#endif
/* Core functions */
void tp_lld_init(const TOUCHPADDriver *tp);
void ts_lld_init(const TouchscreenDriver *ts);
uint16_t tp_lld_read_value(uint8_t cmd);
uint16_t tp_lld_read_x(void);
uint16_t tp_lld_read_y(void);
uint16_t ts_lld_read_value(uint8_t cmd);
uint16_t ts_lld_read_x(void);
uint16_t ts_lld_read_y(void);
#if TOUCHPAD_HAS_IRQ
uint8_t tp_lld_irq(void);
#if TOUCHSCREEN_HAS_IRQ
uint8_t ts_lld_irq(void);
#endif
#if TOUCHPAD_HAS_PRESSURE
uint16_t tp_lld_read_z(void);
#if TOUCHSCREEN_HAS_PRESSURE
uint16_t ts_lld_read_z(void);
#endif
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_TOUCHPAD */
#endif /* GFX_USE_TOUCHSCREEN */
#endif /* _TOUCHPAD_LLD_H */
#endif /* _TOUCHSCREEN_LLD_H */
/** @} */

View file

@ -1,334 +0,0 @@
/*
ChibiOS/RT - Copyright (C) 2012
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/>.
*/
#include "gui.h"
static struct guiNode_t *firstGUI = NULL;
uint16_t x, y; // global touchpad coordinates
static uint8_t addElement(struct guiNode_t *newNode) {
struct guiNode_t *new;
if(firstGUI == NULL) {
firstGUI = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(firstGUI == NULL)
return 0;
*firstGUI = *newNode;
firstGUI->next = NULL;
} else {
new = firstGUI;
while(new->next != NULL)
new = new->next;
new->next = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(new->next == NULL)
return 0;
new = new->next;
*new = *newNode;
new->next = NULL;
}
return 1;
}
static uint8_t deleteElement(char *label) {
struct guiNode_t *pointer, *pointer1;
if(firstGUI != NULL) {
if(strcmp(firstGUI->label, label) == 0) {
pointer = firstGUI->next;
chHeapFree(firstGUI);
firstGUI = pointer;
} else {
pointer = firstGUI;
while(pointer->next != NULL) {
pointer1 = pointer->next;
if(strcmp(firstGUI->label, label) == 0) {
pointer->next = pointer1->next;
chHeapFree(pointer1);
break;
}
pointer = pointer1;
}
}
return 1; // successful
}
return 0; // not successful
}
void guiPrintElements(BaseSequentialStream *chp) {
struct guiNode_t *pointer = firstGUI;
chprintf(chp, "\r\n\nguiNodes:\r\n\n");
while(pointer != NULL) {
chprintf(chp, "x0: %d\r\n", pointer->x0);
chprintf(chp, "y0: %d\r\n", pointer->y0);
chprintf(chp, "x1: %d\r\n", pointer->x1);
chprintf(chp, "y1: %d\r\n", pointer->y1);
chprintf(chp, "label: %s\r\n", pointer->label);
chprintf(chp, "active: %d\r\n", *(pointer->active));
chprintf(chp, "state: %d\r\n", *(pointer->state));
chprintf(chp, "*next: 0x%x\r\n", pointer->next);
chprintf(chp, "\r\n\n");
pointer = pointer->next;
}
}
static inline void buttonUpdate(struct guiNode_t *node) {
if(x >= node->x0 && x <= node->x1 && y >= node->y0 && y <= node->y1) {
*(node->state) = 1;
} else {
*(node->state) = 0;
}
}
static inline void sliderUpdate(struct guiNode_t *node) {
uint16_t length = 1;
if(node->orientation == horizontal)
length = node->x1 - node->x0;
else if(node->orientation == vertical)
length = node->y1 - node->y0;
if(node->mode == modePassive) {
node->percentage = *(node->state);
} else if(node->mode == modeActive) {
if(x >= node->x0 && x <= node->x1 && y >= node->y0 && y <= node->y1) {
if(node->orientation == horizontal) {
node->percentage = (((x - node->x0) * 100) / length);
} else if(node->orientation == vertical) {
node->percentage = (((y - node->y0) * 100) / length);
}
}
*(node->state) = node->percentage;
}
// a bit of safety here
if(node->percentage > 100)
node->percentage = 100;
if(node->orientation == horizontal) {
node->value = ((((node->x1)-(node->x0)) * node->percentage) / 100);
if(node->oldValue > node->value || node->value == 0)
lcdFillArea(node->x0+1, node->y0+1, node->x1, node->y1, node->bkColor);
else
lcdDrawRect(node->x0+1, node->y0+1, node->x0+node->value, node->y1, filled, node->valueColor);
} else if(node->orientation == vertical) {
node->value = ((((node->y1)-(node->y0)) * node->percentage) / 100);
if(node->oldValue > node->value || node->value == 0)
lcdFillArea(node->x0+1, node->y0+1, node->x1, node->y1, node->bkColor);
else
lcdDrawRect(node->x0+1, node->y0+1, node->x1, node->y0+node->value, filled, node->valueColor);
}
node->oldValue = node->value;
}
static inline void wheelUpdate(struct guiNode_t *node) {
(void)node;
}
static inline void keymatrixUpdate(struct guiNode_t *node) {
(void)node;
}
static void guiThread(const uint16_t interval) {
struct guiNode_t *node;
chRegSetThreadName("GUI");
while(TRUE) {
for(node = firstGUI; node; node = node->next) {
// check if GUI element is set active
if(*(node->active) == active) {
x = tpReadX();
y = tpReadY();
switch(node->type) {
case button:
buttonUpdate(node);
break;
case slider:
sliderUpdate(node);
break;
case wheel:
wheelUpdate(node);
break;
case keymatrix:
keymatrixUpdate(node);
break;
}
}
}
chThdSleepMilliseconds(interval);
}
}
Thread *guiInit(uint16_t interval, tprio_t priority) {
Thread *tp = NULL;
tp = chThdCreateFromHeap(NULL, THD_WA_SIZE(512), priority, guiThread, interval);
return tp;
}
uint8_t guiDeleteElement(char *label) {
return deleteElement(label);
}
uint8_t guiDrawButton(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, char *str, font_t font, uint16_t fontColor, uint16_t buttonColor, uint16_t shadow, char *label, uint8_t *active, uint8_t *state) {
struct guiNode_t *newNode;
uint16_t i;
newNode = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(newNode == NULL)
return 0;
newNode->type = button;
newNode->label = label;
newNode->x0 = x0;
newNode->y0 = y0;
newNode->x1 = x1;
newNode->y1 = y1;
newNode->shadow = shadow;
newNode->active = active;
newNode->state = state;
if(addElement(newNode) != 1)
return 0;
lcdDrawRectString(x0, y0, x1, y1, str, font, fontColor, buttonColor);
if(shadow != 0) {
for(i = 0; i < shadow; i++) {
lcdDrawLine(x0+shadow, y1+i, x1+shadow-1, y1+i, Black);
lcdDrawLine(x1+i, y0+shadow, x1+i, y1+shadow-1, Black);
}
}
chHeapFree(newNode);
return 1;
}
uint8_t guiDrawSlider(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t orientation, uint8_t mode, uint16_t frameColor, uint16_t bkColor, uint16_t valueColor, char *label, uint8_t *active, uint8_t *value) {
struct guiNode_t *newNode;
newNode = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(newNode == NULL)
return 0;
newNode->type = slider;
newNode->label = label;
newNode->x0 = x0;
newNode->y0 = y0;
newNode->x1 = x1;
newNode->y1 = y1;
newNode->mode = mode;
newNode->bkColor = bkColor;
newNode->valueColor = valueColor;
newNode->state = value;
newNode->active = active;
newNode->orientation = orientation;
newNode->percentage = 0;
if(addElement(newNode) != 1)
return 0;
(void)bkColor;
(void)valueColor;
// lcdDraw functions
lcdDrawRect(x0, y0, x1, y1, frame, frameColor);
chHeapFree(newNode);
return 1;
}
uint8_t guiDrawWheel(uint16_t x0, uint16_t y0, uint16_t radius1, uint16_t radius2, uint16_t bkColor, uint16_t valueColor, char *label, uint8_t *active, uint8_t *value) {
struct guiNode_t *newNode;
newNode = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(newNode == NULL)
return 0;
newNode->type = wheel;
newNode->label = label;
newNode->x0 = x0;
newNode->y0 = y0;
newNode->r1 = radius1;
newNode->r2 = radius2;
newNode->active = active;
newNode->state = value;
if(addElement(newNode) != 1)
return 0;
(void)bkColor;
(void)valueColor;
// lcdDraw functions
chHeapFree(newNode);
return 1;
}
uint8_t guiDrawKeymatrix(uint16_t x0, uint16_t y0, uint16_t size, uint16_t space, uint16_t shadow, uint16_t buttonColor, uint16_t fontColor, font_t font, char *label, uint8_t *active, uint8_t *value) {
struct guiNode_t *newNode;
newNode = chHeapAlloc(NULL, sizeof(struct guiNode_t));
if(newNode == NULL)
return 0;
newNode->type = keymatrix;
newNode->label = label;
newNode->x0 = x0;
newNode->y0 = y0;
newNode->shadow = shadow;
newNode->active = active;
newNode->state = value;
if(addElement(newNode) != 1)
return 0;
// lcdDraw functions
(void)size;
(void)space;
(void)buttonColor;
(void)fontColor;
(void)font;
chHeapFree(newNode);
return 1;
}

View file

@ -1,115 +0,0 @@
/*
ChibiOS/RT - Copyright (C) 2012
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/>.
*/
#ifndef GUI_H
#define GUI_H
#include "ch.h"
#include "hal.h"
#include "glcd.h"
#include "chprintf.h"
#include "touchpad.h"
#include <string.h>
struct guiNode_t {
uint8_t type;
uint16_t x0;
uint16_t y0;
uint16_t x1;
uint16_t y1;
uint16_t r1;
uint16_t r2;
uint16_t shadow;
uint16_t bkColor;
uint16_t valueColor;
uint16_t value;
uint16_t oldValue;
uint16_t percentage;
uint8_t orientation;
uint8_t mode;
uint8_t *active;
uint8_t *state;
char *label;
struct guiNode_t *next;
};
#ifdef __cplusplus
extern "C" {
#endif
enum {button, slider, wheel, keymatrix};
enum {horizontal, vertical};
enum {inactive, active};
enum {modePassive, modeActive};
/*
* Description: creates the GUI thread
*
* param: - interval: thread sleep in milliseconds after each GUI element update
* - priority: priority of the thread
*
* return: pointer to created thread
*/
Thread *guiInit(uint16_t interval, tprio_t priority);
/*
* Description: prints all GUI elements structs (linked list)
*
* param: - chp: pointer to output stream
*
* return: none
*/
void guiPrintElements(BaseSequentialStream *chp);
/*
* Description: deletes a GUI element from the linked list
*
* param: - label: label of the element (parameter of each guiDrawXXX function)
*
* return: 1 if successful, 0 otherwise
*/
uint8_t guiDeleteElement(char *label);
/*
* Description: draws a button on the screen and keeps it's state up to date
*
* param: - x0, y0, x1, y1: start and end coordinates of the button's rectangle
* - str: string that gets drawn into the rectangle - button's lable
* - fontColor: color of the lable
* - buttonColor: color of the rectangle
* - shadow: draws a black shadow with N pixels size if != 0
* - active: pass pointer to variable which holds the state 'active' or 'inactive'
* - state: pass pointer to variable whcih will keep the state of the button (pressed / unpressed)'
*
* return: 1 if button successfully created
*/
uint8_t guiDrawButton(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, char *str, font_t font, uint16_t fontColor, uint16_t buttonColor, uint16_t shadow, char *label, uint8_t *active, uint8_t *state);
uint8_t guiDrawSlider(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint8_t orientation, uint8_t mode, uint16_t frameColor, uint16_t bkColor, uint16_t valueColor, char *label, uint8_t *active, uint8_t *value);
uint8_t guiDrawWheel(uint16_t x0, uint16_t y0, uint16_t radius1, uint16_t radius2, uint16_t bkColor, uint16_t valueColor, char *label, uint8_t *active, uint8_t *value);
uint8_t guiDrawKeymatrix(uint16_t x0, uint16_t y0, uint16_t buttonSize, uint16_t space, uint16_t shadow, uint16_t buttonColor, uint16_t fontColor, font_t font, char *label, uint8_t *active, uint8_t *value);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,3 +0,0 @@
GDISP_GUI_SRC = $(GFXLIB)/gui/gui.c
GDISP_GUI_INC = $(GFXLIB)/gui

View file

@ -2,7 +2,12 @@
*** Releases ***
*****************************************************************************
current stable: 1.3
current stable: 1.4
*** changes after 1.4 ***
FEATURE: Added three point calibration
FIX: Touchpad renamed into Touchscreen
*** changes after 1.3 ***
@ -14,6 +19,7 @@ FIX: Fix axis orientation for Arc routines
FEATURE: new gdisp rounded box routines
FEATURE: new gdispDrawStringBox()
FEATURE: GWIN infrastructure
FEATURE: now we fully support doxygen
*** changes after 1.2 ***

View file

@ -18,11 +18,19 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file src/console.c
* @brief CONSOLE code.
*
* @addtogroup CONSOLE
* @{
*/
#include "ch.h"
#include "hal.h"
#include "console.h"
#if GFX_USE_CONSOLE
#if GFX_USE_CONSOLE || defined(__DOXYGEN__)
/*
* Interface implementation. The interface is write only
@ -86,6 +94,18 @@ static const struct GConsoleVMT vmt = {
putt, gett, writet, readt
};
/**
* @brief Initializes a console.
*
* @param[in] console The console driver struct
* @param[in] x0,y0 The location of the upper left corner of the resulting window
* @param[in] width, height The width and height of the window
* @param[in] font The font to be used when printing to the console
* @param[in] bkcolor The background color
* @param[in] color The foreground / font color
*
* @return RDY_OK if done
*/
msg_t gfxConsoleInit(GConsole *console, coord_t x0, coord_t y0, coord_t width, coord_t height, font_t font, pixel_t bkcolor, pixel_t color) {
console->vmt = &vmt;
/* read font, get height & padding */
@ -110,6 +130,14 @@ msg_t gfxConsoleInit(GConsole *console, coord_t x0, coord_t y0, coord_t width, c
return RDY_OK;
}
/**
* @brief Write a single character to the console.
*
* @param[in] console The console driver struct
* @param[in] c The char to be written
*
* @return RDY_OK if done
*/
msg_t gfxConsolePut(GConsole *console, char c) {
uint8_t width;
@ -164,6 +192,17 @@ msg_t gfxConsolePut(GConsole *console, char c) {
return RDY_OK;
}
/**
* @brief Write a string to the console.
*
* @param[in] console The console driver struct
* @param[in] bp The buffer / string
* @param[in] n The size of the buffer
*
* @return RDY_OK if done
*
* @api
*/
msg_t gfxConsoleWrite(GConsole *console, const uint8_t *bp, size_t n) {
size_t i;
for(i = 0; i < n; i++)
@ -172,5 +211,6 @@ msg_t gfxConsoleWrite(GConsole *console, const uint8_t *bp, size_t n) {
return RDY_OK;
}
#endif
#endif /* GFX_USE_CONSOLE */
/** @} */

View file

@ -1,14 +0,0 @@
The new GDISP driver is an architecture independent rewrite of the GLCD interface.
This new architecture independence should allow many new low level drivers to be easily added.
GDISP allows low-level driver hardware accelerated drawing routines while providing a software emulation
if the low level driver can not provide it. A basic low level driver now only requires 2 routines to be written.
A glcd.h compatibility file has been included that allow applications written to use the existing GLCD driver to
use the GDISP driver with little or no change.
It is written in the ChibiOS style with ChibiOS style includes and documentation.
It is encapsulated into a "halext" structure with appropriate readme's that allow for easy inclusion in any
ChibiOS project. This structure can be seamlessly added to as new driver types are added and it supports
low level drivers that are neither platform or board specific (although they can be).

View file

@ -19,7 +19,7 @@
*/
/**
* @file gdisp.c
* @file src/gdisp.c
* @brief GDISP Driver code.
*
* @addtogroup GDISP
@ -144,6 +144,8 @@
* @note This function is NOT currently implicitly invoked by @p halInit().
* It must be called manually.
*
* @return True if succeeded, False otherwise
*
* @init
*/
bool_t gdispInit(void) {
@ -192,7 +194,9 @@
/**
* @brief Test if the GDISP engine is currently drawing.
* @note This function will always return FALSE if
* GDISP_NEED_ASYNC is not defined.
* GDISP_NEED_ASYNC is not defined.
*
* @return TRUE if gdisp is busy, FALSE otherwise
*
* @init
*/
@ -208,7 +212,6 @@
#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__)
/**
* @brief Clear the display to the specified color.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] color The color to use when clearing the screen
*
@ -230,7 +233,6 @@
#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__)
/**
* @brief Set a pixel in the specified color.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position to set the pixel.
* @param[in] color The color to use
@ -255,7 +257,6 @@
#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__)
/**
* @brief Draw a line.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The start position
* @param[in] x1,y1 The end position
@ -280,24 +281,11 @@
}
#endif
/**
* @brief Draw a dashed line.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The start position
* @param[in] x1,y1 The end position
* @param[in] length The length of the dash
* @param[in] color The color of the dashed line
*
* @api
*/
#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__)
/**
* @brief Fill an area with a color.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The start position
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
* @param[in] color The color to use
*
@ -323,7 +311,6 @@
#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__)
/**
* @brief Fill an area using the supplied bitmap.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
* @details The bitmap is in the pixel format specified by the low level driver
* @note If a packed pixel format is used and the width doesn't
* match a whole number of bytes, the next line will start on a
@ -332,9 +319,11 @@
* or at least retained until this call has finished the blit. You can
* tell when all graphics drawing is finished by @p gdispIsBusy() going FALSE.
*
* @param[in] x,y The start position
* @param[in] cx,cy The size of the filled area
* @param[in] buffer The bitmap in the driver's pixel format.
* @param[in] x,y The start position
* @param[in] cx,cy The size of the filled area
* @param[in] srcx,srcy I've no idea
* @param[in] srccx Really, I've no fucking idea
* @param[in] buffer The bitmap in the driver's pixel format
*
* @api
*/
@ -361,7 +350,6 @@
#if (GDISP_NEED_CLIP && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Clip all drawing to the defined area.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The start position
* @param[in] cx,cy The size of the clip area
@ -387,9 +375,8 @@
#if (GDISP_NEED_CIRCLE && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw a circle.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The center of the circle
* @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color to use
*
@ -414,9 +401,8 @@
#if (GDISP_NEED_CIRCLE && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw a filled circle.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The center of the circle
* @param[in] x,y The center of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color to use
*
@ -441,9 +427,8 @@
#if (GDISP_NEED_ELLIPSE && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw an ellipse.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The center of the ellipse
* @param[in] x,y The center of the ellipse
* @param[in] a,b The dimensions of the ellipse
* @param[in] color The color to use
*
@ -469,9 +454,8 @@
#if (GDISP_NEED_ELLIPSE && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw a filled ellipse.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The center of the ellipse
* @param[in] x,y The center of the ellipse
* @param[in] a,b The dimensions of the ellipse
* @param[in] color The color to use
*
@ -497,7 +481,6 @@
#if (GDISP_NEED_ARC && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/*
* @brief Draw an arc.
* @pre The GDISP must be in powerOn or powerSleep mode.
*
* @param[in] x0,y0 The center point
* @param[in] radius The radius of the arc
@ -528,7 +511,6 @@
#if (GDISP_NEED_ARC && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/*
* @brief Draw a filled arc.
* @pre The GDISP must be in powerOn or powerSleep mode.
* @note Not very efficient currently - does lots of overdrawing
*
* @param[in] x0,y0 The center point
@ -560,7 +542,6 @@
#if GDISP_NEED_ARC || defined(__DOXYGEN__)
/**
* @brief Draw a rectangular box with rounded corners
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
@ -588,7 +569,6 @@ void gdispDrawRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
#if GDISP_NEED_ARC || defined(__DOXYGEN__)
/**
* @brief Draw a filled rectangular box with rounded corners
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
@ -618,11 +598,11 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
#if (GDISP_NEED_TEXT && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw a text character.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] color The color to use
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] font The font to use
* @param[in] color The color to use
*
* @api
*/
@ -646,12 +626,12 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
#if (GDISP_NEED_TEXT && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Draw a text character with a filled background.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
* @param[in] x,y The position for the text
* @param[in] c The character to draw
* @param[in] font The font to use
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
*
* @api
*/
@ -697,6 +677,7 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
#if (GDISP_NEED_SCROLL && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__)
/**
* @brief Scroll vertically a section of the screen.
* @pre GDISP_NEED_SCROLL must be set to TRUE in halconf.h
* @note Optional.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
*
@ -732,7 +713,8 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
* @note Depending on the hardware implementation this function may not
* support some codes. They will be ignored.
*
* @param[in] powerMode The power mode to use
* @param[in] what what you want to control
* @param[in] value The value to be assigned
*
* @api
*/
@ -779,7 +761,6 @@ void gdispFillRoundedBox(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t r
/**
* @brief Draw a rectangular box.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The start position
* @param[in] cx,cy The size of the box (outside dimensions)
@ -817,11 +798,11 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
* @brief Draw a text string.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position for the text
* @param[in] str The string to draw
* @param[in] color The color to use
* @param[in] x,y The position for the text
* @param[in] font The font to use
* @param[in] str The string to draw
* @param[in] color The color to use
*
* @api
*/
@ -859,12 +840,12 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
* @brief Draw a text string.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position for the text
* @param[in] str The string to draw
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
* @param[in] x,y The position for the text
* @param[in] str The string to draw
* @param[in] font The font to use
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
*
* @api
*/
@ -904,12 +885,13 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
* @brief Draw a text string verticly centered within the specified box.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
*
* @param[in] x,y The position for the text (need to define top-right or base-line - check code)
* @param[in] str The string to draw
* @param[in] color The color to use
* @param[in] justify Justify the text left, center or right within the box
* @param[in] x,y The position for the text (need to define top-right or base-line - check code)
* @param[in] cx,cy The width and height of the box
* @param[in] str The string to draw
* @param[in] font The font to use
* @param[in] color The color to use
* @param[in] justify Justify the text left, center or right within the box
*
* @api
*/
@ -1035,14 +1017,15 @@ void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_TEXT || defined(__DOXYGEN__)
/**
* @brief Draw a text string verticly centered within the specified box. The box background is filled with the specified background color.
* @pre The GDISP unit must be in powerOn or powerSleep mode.
* @note The entire box is filled
*
* @param[in] x,y The position for the text (need to define top-right or base-line - check code)
* @param[in] str The string to draw
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
* @param[in] justify Justify the text left, center or right within the box
* @param[in] x,y The position for the text (need to define top-right or base-line - check code)
* @param[in] cx,cy The width and height of the box
* @param[in] str The string to draw
* @param[in] font The font to use
* @param[in] color The color to use
* @param[in] bgcolor The background color to use
* @param[in] justify Justify the text left, center or right within the box
*
* @api
*/

View file

@ -17,6 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
Font tables included into gdisp.c
*/
@ -653,3 +654,4 @@
#endif /* GDISP_NEED_TEXT */
#endif /* GFX_USE_GDISP */

View file

@ -18,13 +18,20 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file src/graph.c
* @brief GRAPH module code.
*
* @addtogroup GRAPH
* @{
*/
#include <stdlib.h>
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "graph.h"
#if GFX_USE_GRAPH
#if GFX_USE_GRAPH || defined(__DOXYGEN__)
static void _horizontalDotLine(coord_t x0, coord_t y0, coord_t x1, uint16_t space, color_t color) {
uint16_t offset = x0;
@ -46,6 +53,16 @@ static void _verticalDotLine(coord_t x0, coord_t y0, coord_t y1, uint16_t space,
} while(count--);
}
/**
* @brief Draws a graph system
* @details Draws a graph system with two axis, X and Y.
* Different optinal parameters like grid size, grid color,
* arrow color (if any) etc. are defined in the struct.
*
* @param[in] g A pointer to a Graph struct
*
* @init
*/
void graphDrawSystem(Graph *g) {
uint16_t i;
@ -85,7 +102,17 @@ void graphDrawSystem(Graph *g) {
}
}
bool_t _boundaryCheck(Graph *g, coord_t x, coord_t y) {
/**
* @brief Checks if x and y are inside the graph area
*
* @param[in] g The pointer to the graph
* @param[in] x,y The coordinates to be checked
*
* @return 1 if outside the graph area, 0 otherwise
*
* @notapi
*/
static bool_t _boundaryCheck(Graph *g, coord_t x, coord_t y) {
if(g->origin_x + x > g->x1)
return 1;
if(g->origin_x + x < g->x0)
@ -98,6 +125,18 @@ bool_t _boundaryCheck(Graph *g, coord_t x, coord_t y) {
return 0;
}
/**
* @brief Draws a single dot into the graph
* @note The dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] x,y The coordinates where the data point will be drawn
* @param[in] radius The radius of the dot. One pixel if 0.
* @param[in] color The color of the dot.
*
* @api
*/
void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color) {
if(_boundaryCheck(g, x, y))
return;
@ -108,6 +147,19 @@ void graphDrawDot(Graph *g, coord_t x, coord_t y, uint16_t radius, color_t color
gdispFillCircle(g->origin_x + x, g->origin_y - y, radius, color);
}
/**
* @brief Draws multiple dots into the graph
* @note A dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] coord A two dimensional int array containing the dots coordinates.
* @param[in] entries How many dots will be drawn (array index from 0 to entries);
* @param[in] radius The radius of the dots. One pixel if 0.
* @param[in] color The color of the dots.
*
* @api
*/
void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
uint16_t i;
@ -122,6 +174,20 @@ void graphDrawDots(Graph *g, int coord[][2], uint16_t entries, uint16_t radius,
}
}
/**
* @brief Draws multiple dots into the graph and connects them by a line
* @note A dot won't be drawn if it's outsite the max and min
* values of the graph.
*
* @param[in] g The pointer to the graph
* @param[in] coord A two dimensional int array containing the dots coordinates.
* @param[in] entries How many dots will be drawn (array index from 0 to entries);
* @param[in] radius The radius of the dots. One pixel if 0.
* @param[in] lineColor The color of the line.
* @param[in] dotColor The color of the dots.
*
* @api
*/
void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
uint16_t i;
@ -146,4 +212,5 @@ void graphDrawNet(Graph *g, int coord[][2], uint16_t entries, uint16_t radius, u
}
#endif /* GFX_USE_GRAPH */
/** @} */

View file

@ -19,7 +19,7 @@
*/
/**
* @file gwin.c
* @file src/gwin.c
* @brief GWIN Driver code.
*
* @addtogroup GWIN
@ -166,6 +166,7 @@ void gwinClear(GHandle gh) {
* @note May leave GDISP clipping to this window's dimensions
*
* @param[in] gh The window handle
* @param[in] x,y The coordinates of the pixel
*
* @api
*/
@ -887,3 +888,4 @@ void gwinButtonDraw(GHandle gh) {
#endif /* _GWIN_C */
/** @} */

View file

@ -1,278 +0,0 @@
/* ChibiOS/GFX - Copyright (C) 2012
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 touchpad.c
* @brief Touchpad Driver code.
*
* @addgroup TOUCHPAD
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "touchpad.h"
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
#if TOUCHPAD_STORE_CALIBRATION
extern void tp_store_calibration_lld(struct cal_t *cal);
extern struct cal_t *tp_restore_calibration_lld(void);
#endif
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
static struct cal_t *cal;
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/**
* @brief returns the uncalibrated readout of the X direction from the controller
*
* @noapi
*/
static uint16_t _tpReadRealX(void) {
uint32_t results = 0;
uint16_t i, x;
/* Median filtering is already done in LLD */
for(i = 0; i < CONVERSIONS; i++) {
results += tp_lld_read_x();
}
/* Take the average of the readings */
x = results / CONVERSIONS;
return x;
}
/**
* @brief return the uncalibrated readout of the Y-direction from the controller
*
* @noapi
*/
static uint16_t _tpReadRealY(void) {
uint32_t results = 0;
uint16_t i, y;
/* Median filtering is already done in LLD */
for(i = 0; i < CONVERSIONS; i++) {
results += tp_lld_read_y();
}
/* Take the average of the readings */
y = results / CONVERSIONS;
return y;
}
/**
* @brief draws a cross. Used for calibration.
*
* @noapi
*/
static void _tpDrawCross(uint16_t x, uint16_t y) {
gdispDrawLine(x-15, y, x-2, y, 0xffff);
gdispDrawLine(x+2, y, x+15, y, 0xffff);
gdispDrawLine(x, y-15, x, y-2, 0xffff);
gdispDrawLine(x, y+2, x, y+15, 0xffff);
gdispDrawLine(x-15, y+15, x-7, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y+7, x-15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y-15, x-7, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y-7, x-15, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+7, y+15, x+15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+15, y+7, x+15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+7, y-15, x+15, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+15, y-15, x+15, y-7, RGB565CONVERT(184,158,131));
}
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Touchpad Driver initialization.
* @note This function is NOT currently implicitly invoked by @p halInit().
* It must be called manually.
*
* @api
*/
void tpInit(const TOUCHPADDriver *tp) {
cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
if(cal == NULL)
return;
/* Initialise Mutex */
//MUTEX_INIT
/* Initialise driver */
//MUTEX_ENTER
tp_lld_init(tp);
//MUTEX_EXIT
#if TOUCHPAD_STORE_CALIBRATION
cal = tp_restore_calibration_lld();
if(cal == NULL) {
cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
tpCalibrate();
}
#endif
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The X position in pixels.
*
* @api
*/
uint16_t tpReadX(void) {
uint16_t x, y;
#if TOUCHPAD_XY_INVERTED == TRUE
x = cal->xm * _tpReadRealY() + cal->xn;
y = cal->ym * _tpReadRealX() + cal->yn;
#else
x = cal->xm * _tpReadRealX() + cal->xn;
y = cal->ym * _tpReadRealY() + cal->yn;
#endif
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return x;
case GDISP_ROTATE_90:
return y;
case GDISP_ROTATE_180:
return GDISP_SCREEN_WIDTH - x - 1;
case GDISP_ROTATE_270:
return GDISP_SCREEN_HEIGHT - y - 1;
}
return 0;
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The Y position in pixels.
*
* @api
*/
uint16_t tpReadY(void) {
uint16_t x, y;
#if TOUCHPAD_XY_INVERTED == TRUE
x = cal->xm * _tpReadRealY() + cal->xn;
y = cal->ym * _tpReadRealX() + cal->yn;
#else
x = cal->xm * _tpReadRealX() + cal->xn;
y = cal->ym * _tpReadRealY() + cal->yn;
#endif
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return y;
case GDISP_ROTATE_90:
return GDISP_SCREEN_WIDTH - x - 1;
case GDISP_ROTATE_180:
return GDISP_SCREEN_HEIGHT - y - 1;
case GDISP_ROTATE_270:
return x;
}
return 0;
}
void tpCalibrate(void) {
const uint16_t h = gdispGetHeight();
const uint16_t w = gdispGetWidth();
const uint16_t cross[2][2] = {{(w/8), (h/8)}, {(w-(w/8)) , (h-(h/8))}};
uint16_t points[2][2];
uint8_t i;
gdispSetOrientation(GDISP_ROTATE_0);
gdispClear(Red);
gdispFillStringBox(0, 10, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Red, justifyCenter);
for(i = 0; i < 2; i++) {
_tpDrawCross(cross[i][0], cross[i][1]);
while(!tpIRQ());
points[i][0] = _tpReadRealX();
points[i][1] = _tpReadRealY();
chThdSleepMilliseconds(100);
while(tpIRQ());
gdispFillArea(cross[i][0]-15, cross[i][1]-15, 42, 42, Red);
}
cal->xm = ((float)cross[1][0] - (float)cross[0][0]) / ((float)points[1][0] - (float)points[0][0]);
cal->ym = ((float)cross[1][1] - (float)cross[0][1]) / ((float)points[1][1] - (float)points[0][1]);
cal->xn = (float)cross[0][0] - cal->xm * (float)points[0][0];
cal->yn = (float)cross[0][1] - cal->ym * (float)points[0][1];
#if TOUCHPAD_STORE_CALIBRATION
tp_store_calibration_lld(cal);
#endif
}
/**
* @brief returns if touchpad is pressed or not
*
* @return 1 if pressed, 0 otherwise
*
* @api
*/
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
uint8_t tpIRQ(void) {
return tp_lld_irq();
}
#endif
/**
* @brief Get the pressure.
*
* @return The pressure.
*
* @api
*/
#if TOUCHPAD_HAS_PRESSURE || defined(__DOXYGEN__)
uint16_t tpReadZ(void) {
/* ToDo */
return (tp_lld_read_z());
}
#endif
#endif /* GFX_USE_TOUCHPAD */
/** @} */

374
src/touchscreen.c Normal file
View file

@ -0,0 +1,374 @@
/* ChibiOS/GFX - Copyright (C) 2012
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 src/touchscreen.c
* @brief Touchscreen Driver code.
*
* @addtogroup TOUCHSCREEN
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#include "touchscreen.h"
#if GFX_USE_TOUCHSCREEN || defined(__DOXYGEN__)
#if TOUCHSCREEN_STORE_CALIBRATION
extern void ts_store_calibration_lld(struct cal_t *cal);
extern struct cal_t *ts_restore_calibration_lld(void);
#endif
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
static struct cal_t *cal;
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
static coord_t _tsReadRealX(void) {
int32_t results = 0;
int16_t i;
coord_t x;
for(i = 0; i < CONVERSIONS; i++) {
results += ts_lld_read_x();
}
/* Take the average of the readings */
x = results / CONVERSIONS;
return x;
}
static coord_t _tsReadRealY(void) {
int32_t results = 0;
int16_t i;
coord_t y;
for(i = 0; i < CONVERSIONS; i++) {
results += ts_lld_read_y();
}
/* Take the average of the readings */
y = results / CONVERSIONS;
return y;
}
static void _tsDrawCross(uint16_t x, uint16_t y) {
gdispDrawLine(x-15, y, x-2, y, 0xffff);
gdispDrawLine(x+2, y, x+15, y, 0xffff);
gdispDrawLine(x, y-15, x, y-2, 0xffff);
gdispDrawLine(x, y+2, x, y+15, 0xffff);
gdispDrawLine(x-15, y+15, x-7, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y+7, x-15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y-15, x-7, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x-15, y-7, x-15, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+7, y+15, x+15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+15, y+7, x+15, y+15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+7, y-15, x+15, y-15, RGB565CONVERT(184,158,131));
gdispDrawLine(x+15, y-15, x+15, y-7, RGB565CONVERT(184,158,131));
}
static void _tsTransform(coord_t *x, coord_t *y) {
*x = (coord_t) (cal->ax * (*x) + cal->bx * (*y) + cal->cx);
*y = (coord_t) (cal->ay * (*x) + cal->by * (*y) + cal->cy);
}
static void _tsDo3PointCalibration(const coord_t (*cross)[2], coord_t (*points)[2], cal_t *c) {
float dx, dx0, dx1, dx2, dy0, dy1, dy2;
/* Compute all the required determinants */
dx = ((float)(points[0][0] - points[2][0])) * ((float)(points[1][1] - points[2][1]))
- ((float)(points[1][0] - points[2][0])) * ((float)(points[0][1] - points[2][1]));
dx0 = ((float)(cross[0][0] - cross[2][0])) * ((float)(points[1][1] - points[2][1]))
- ((float)(cross[1][0] - cross[2][0])) * ((float)(points[0][1] - points[2][1]));
dx1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][0] - cross[2][0]))
- ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][0] - cross[2][0]));
dx2 = cross[0][0] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
cross[1][0] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
cross[2][0] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
dy0 = ((float)(cross[0][1] - cross[2][1])) * ((float)(points[1][1] - points[2][1]))
- ((float)(cross[1][1] - cross[2][1])) * ((float)(points[0][1] - points[2][1]));
dy1 = ((float)(points[0][0] - points[2][0])) * ((float)(cross[1][1] - cross[2][1]))
- ((float)(points[1][0] - points[2][0])) * ((float)(cross[0][1] - cross[2][1]));
dy2 = cross[0][1] * ((float)points[1][0] * (float)points[2][1] - (float)points[2][0] * (float)points[1][1]) -
cross[1][1] * ((float)points[0][0] * (float)points[2][1] - (float)points[2][0] * (float)points[0][1]) +
cross[2][1] * ((float)points[0][0] * (float)points[1][1] - (float)points[1][0] * (float)points[0][1]);
/* Now, calculate all the required coefficients */
c->ax = dx0 / dx;
c->bx = dx1 / dx;
c->cx = dx2 / dx;
c->ay = dy0 / dx;
c->by = dy1 / dx;
c->cy = dy2 / dx;
}
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/**
* @brief Touchscreen Driver initialization.
* @note This function is NOT currently implicitly invoked by @p halInit().
* It must be called manually.
*
* @param[in] ts The touchscreen driver struct
*
* @api
*/
void tsInit(const TouchscreenDriver *ts) {
cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
if(cal == NULL)
return;
/* Initialise Mutex */
//MUTEX_INIT
/* Initialise driver */
//MUTEX_ENTER
ts_lld_init(ts);
//MUTEX_EXIT
#if TOUCHSCREEN_STORE_CALIBRATION
cal = ts_restore_calibration_lld();
if(cal == NULL) {
cal = (struct cal_t*)chHeapAlloc(NULL, sizeof(struct cal_t));
tsCalibrate();
}
#endif
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The X position in pixels.
*
* @api
*/
coord_t tsReadX(void) {
coord_t x, y;
#if TOUCHSCREEN_XY_INVERTED == TRUE
x = _tsReadRealY();
y = _tsReadRealX();
#else
x = _tsReadRealX();
y = _tsReadRealY();
#endif
_tsTransform(&x, &y);
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return x;
case GDISP_ROTATE_90:
return y;
case GDISP_ROTATE_180:
return GDISP_SCREEN_WIDTH - x - 1;
case GDISP_ROTATE_270:
return GDISP_SCREEN_HEIGHT - y - 1;
}
return 0;
}
/**
* @brief Get the X-Coordinate, relative to screen zero point.
*
* @return The Y position in pixels.
*
* @api
*/
coord_t tsReadY(void) {
coord_t x, y;
#if TOUCHSCREEN_XY_INVERTED == TRUE
x = _tsReadRealY();
y = _tsReadRealX();
#else
x = _tsReadRealX();
y = _tsReadRealY();
#endif
_tsTransform(&x, &y);
switch(gdispGetOrientation()) {
case GDISP_ROTATE_0:
return y;
case GDISP_ROTATE_90:
return GDISP_SCREEN_WIDTH - x - 1;
case GDISP_ROTATE_180:
return GDISP_SCREEN_HEIGHT - y - 1;
case GDISP_ROTATE_270:
return x;
}
return 0;
}
/**
* @brief Get the pressure.
*
* @return The pressure.
*
* @api
*/
#if TOUCHSCREEN_HAS_PRESSURE || defined(__DOXYGEN__)
uint16_t tsReadZ(void) {
/* ToDo */
return (ts_lld_read_z());
}
#endif
/**
* @brief Returns if touchscreen is pressed or not
*
* @return TRUE if pressed, FALSE otherwise
*
* @api
*/
#if TOUCHSCREEN_HAS_IRQ || defined(__DOXYGEN__)
bool_t tsIRQ(void) {
return ts_lld_irq();
}
#endif
/* Define maximum no. of times to sample the calibration point */
#define MAX_CAL_SAMPLES 10
/**
* @brief Function to calibrate touchscreen
* @details This function interactively performs calibration of the touchscreen
* using 3-point calibration algorithm. Optionally, it also verifies
* the accuracy of the calibration coefficients obtained if the symbol
* TOUCHSCREEN_VERIFY_CALIBRATION is defined in the configuration.
*
* @api
*/
void tsCalibrate(void) {
const uint16_t height = gdispGetHeight();
const uint16_t width = gdispGetWidth();
const coord_t cross[][2] = {{(width / 4), (height / 4)},
{(width - (width / 4)) , (height / 4)},
{(width - (width / 4)) , (height - (height / 4))},
{(width / 2), (height / 2)}}; /* Check point */
coord_t points[4][2];
int32_t px, py;
uint8_t i, j;
gdispSetOrientation(GDISP_ROTATE_0);
gdispClear(Blue);
gdispFillStringBox(0, 5, gdispGetWidth(), 30, "Calibration", &fontUI2Double, White, Blue, justifyCenter);
#if TOUCHSCREEN_VERIFY_CALIBRATION
calibrate:
for(i = 0; i < 4; i++) {
#else
for(i = 0; i < 3; i++) {
#endif
_tsDrawCross(cross[i][0], cross[i][1]);
while(!tsIRQ())
chThdSleepMilliseconds(2); /* Be nice to other threads*/
chThdSleepMilliseconds(20); /* Allow screen to settle */
/* Take a little more samples per point and their average
* for precise calibration */
px = py = 0;
j = 0;
while (j < MAX_CAL_SAMPLES) {
if (tsIRQ()) {
/* We have valid pointer data */
px += _tsReadRealX();
py += _tsReadRealY();
j++;
}
}
points[i][0] = px / j;
points[i][1] = py / j;
chThdSleepMilliseconds(100);
while(tsIRQ())
chThdSleepMilliseconds(2); /* Be nice to other threads*/
gdispFillArea(cross[i][0] - 15, cross[i][1] - 15, 42, 42, Blue);
}
/* Apply 3 point calibration algorithm */
_tsDo3PointCalibration(cross, points, cal);
#if TOUCHSCREEN_VERIFY_CALIBRATION
/* Verification of correctness of calibration (optional) :
* See if the 4th point (Middle of the screen) coincides with the calibrated
* result. If point is with +/- 2 pixel margin, then successful calibration
* Else, start from the beginning.
*/
/* Transform the co-ordinates */
_tpTransform(&points[3][0], &points[3][1]);
/* Calculate the delta */
px = (points[3][0] - cross[3][0]) * (points[3][0] - cross[3][0]) +
(points[3][1] - cross[3][1]) * (points[3][1] - cross[3][1]);
if(px > 4)
goto calibrate;
#endif
/* If enabled, serialize the calibration values for storage */
#if TOUCHSCREEN_STORE_CALIBRATION
ts_store_calibration_lld(cal);
#endif
}
#endif /* GFX_USE_TOUCHSCREEN */
/** @} */

View file

@ -1,558 +0,0 @@
/*
ChibiOS/RT - Copyright (C) 2012
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 templates/gdisp_lld.c
* @brief GDISP Graphics Driver subsystem low level driver source template.
*
* @addtogroup GDISP
* @{
*/
#include "ch.h"
#include "hal.h"
#include "gdisp.h"
#if GFX_USE_GDISP || defined(__DOXYGEN__)
/* Include the emulation code for things we don't support */
#include "gdisp_emulation.c"
#if GDISP_NEED_TEXT && GDISP_HARDWARE_TEXT
#include "gdisp_fonts.h"
#endif
/* All the board specific code should go in these include file so the driver
* can be ported to another board just by creating a suitable file.
*/
#if defined(BOARD_YOURBOARDNAME)
#include "gdisp_lld_board_yourboardname.h"
#else
/* Include the user supplied board definitions */
#include "gdisp_lld_board.h"
#endif
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/* ---- Required Routines ---- */
/*
The following 2 routines are required.
All other routines are optional.
*/
/**
* @brief Low level GDISP driver initialisation.
* @return TRUE if successful, FALSE on error.
*
* @notapi
*/
bool_t GDISP_LLD(init)(void) {
/* Initialise your display */
/* Initialise the GDISP structure to match */
GDISP.Width = GDISP_SCREEN_WIDTH;
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Orientation = GDISP_ROTATE_0;
GDISP.Powermode = powerOn;
GDISP.Backlight = 100;
GDISP.Contrast = 50;
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
GDISP.clipx0 = 0;
GDISP.clipy0 = 0;
GDISP.clipx1 = GDISP.Width;
GDISP.clipy1 = GDISP.Height;
#endif
return TRUE;
}
/**
* @brief Draws a pixel on the display.
*
* @param[in] x X location of the pixel
* @param[in] y Y location of the pixel
* @param[in] color The color of the pixel
*
* @notapi
*/
void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0 || y < GDISP.clipy0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
#endif
/* Code here */
}
/* ---- Optional Routines ---- */
/*
All the below routines are optional.
Defining them will increase speed but everything
will work if they are not defined.
If you are not using a routine - turn it off using
the appropriate GDISP_HARDWARE_XXXX macro.
Don't bother coding for obvious similar routines if
there is no performance penalty as the emulation software
makes a good job of using similar routines.
eg. If fillarea() is defined there is little
point in defining clear() unless the
performance bonus is significant.
For good performance it is suggested to implement
fillarea() and blitarea().
*/
#if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__)
/**
* @brief Clear the display.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] color The color of the pixel
*
* @notapi
*/
void GDISP_LLD(clear)(color_t color) {
/* Code here */
}
#endif
#if GDISP_HARDWARE_LINES || defined(__DOXYGEN__)
/**
* @brief Draw a line.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] x0, y0 The start of the line
* @param[in] x1, y1 The end of the line
* @param[in] color The color of the line
*
* @notapi
*/
void GDISP_LLD(drawline)(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
/**
* @brief Fill an area with a color.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] x, y The start filled area
* @param[in] cx, cy The width and height to be filled
* @param[in] color The color of the fill
*
* @notapi
*/
void GDISP_LLD(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; }
if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; }
if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
/* Code here */
}
#endif
#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
/**
* @brief Fill an area with a bitmap.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] x, y The start filled area
* @param[in] cx, cy The width and height to be filled
* @param[in] srcx, srcy The bitmap position to start the fill from
* @param[in] srccx The width of a line in the bitmap.
* @param[in] buffer The pixels to use to fill the area.
*
* @notapi
*/
void GDISP_LLD(blitareaex)(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; srcx += GDISP.clipx0 - x; x = GDISP.clipx0; }
if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; srcy += GDISP.clipy0 - y; y = GDISP.clipy0; }
if (srcx+cx > srccx) cx = srccx - srcx;
if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
/* Code here */
}
#endif
/* Circular Drawing Functions */
#if (GDISP_NEED_CIRCLE && GDISP_HARDWARE_CIRCLES) || defined(__DOXYGEN__)
/**
* @brief Draw a circle.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the circle is over the edges of the screen.
*
* @param[in] x, y The centre of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color of the circle
*
* @notapi
*/
void GDISP_LLD(drawcircle)(coord_t x, coord_t y, coord_t radius, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_CIRCLE && GDISP_HARDWARE_CIRCLEFILLS) || defined(__DOXYGEN__)
/**
* @brief Create a filled circle.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the circle is over the edges of the screen.
*
* @param[in] x, y The centre of the circle
* @param[in] radius The radius of the circle
* @param[in] color The color of the circle
*
* @notapi
*/
void GDISP_LLD(fillcircle)(coord_t x, coord_t y, coord_t radius, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_ELLIPSE && GDISP_HARDWARE_ELLIPSES) || defined(__DOXYGEN__)
/**
* @brief Draw an ellipse.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the ellipse is over the edges of the screen.
*
* @param[in] x, y The centre of the ellipse
* @param[in] a, b The dimensions of the ellipse
* @param[in] color The color of the ellipse
*
* @notapi
*/
void GDISP_LLD(drawellipse)(coord_t x, coord_t y, coord_t a, coord_t b, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_ELLIPSE && GDISP_HARDWARE_ELLIPSEFILLS) || defined(__DOXYGEN__)
/**
* @brief Create a filled ellipse.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the ellipse is over the edges of the screen.
*
* @param[in] x, y The centre of the ellipse
* @param[in] a, b The dimensions of the ellipse
* @param[in] color The color of the ellipse
*
* @notapi
*/
void GDISP_LLD(fillellipse)(coord_t x, coord_t y, coord_t a, coord_t b, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
/* Arc Drawing Functions */
#if (GDISP_NEED_ARC && GDISP_HARDWARE_ARCS) || defined(__DOXYGEN__)
/**
* @brief Draw an arc.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the circle is over the edges of the screen.
*
* @param[in] x, y The centre of the arc circle
* @param[in] radius The radius of the arc circle
* @param[in] startangle, endangle The start and end angles for the arc (0..359)
* @param[in] color The color of the circle
*
* @notapi
*/
void GDISP_LLD(drawarc)(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_ARC && GDISP_HARDWARE_ARCFILLS) || defined(__DOXYGEN__)
/**
* @brief Create a filled arc.
* @note Optional - The high level driver can emulate using software.
* @note If GDISP_NEED_CLIPPING is defined this routine MUST behave
* correctly if the circle is over the edges of the screen.
*
* @param[in] x, y The centre of the arc circle
* @param[in] radius The radius of the arc circle
* @param[in] startangle, endangle The start and end angles for the arc (0..359)
* @param[in] color The color of the circle
*
* @notapi
*/
void GDISP_LLD(fillarc)(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_TEXT && GDISP_HARDWARE_TEXT) || defined(__DOXYGEN__)
/**
* @brief Draw a character using a transparent background.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] x, y The top-left corner of the text
* @param[in] c The character to print
* @param[in] color The color of the character
*
* @notapi
*/
void GDISP_LLD(drawchar)(coord_t x, coord_t y, char c, font_t font, color_t color) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_TEXT && GDISP_HARDWARE_TEXTFILLS) || defined(__DOXYGEN__)
/**
* @brief Draw a character using a filled background.
* @note Optional - The high level driver can emulate using software.
*
* @param[in] x, y The top-left corner of the text
* @param[in] c The character to print
* @param[in] color The color of the character
* @param[in] bgcolor The background color
*
* @notapi
*/
void GDISP_LLD(fillchar)(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
/* Code here */
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_PIXELREAD && GDISP_HARDWARE_PIXELREAD) || defined(__DOXYGEN__)
/**
* @brief Get the color of a particular pixel.
* @note Optional.
* @note If x,y is off the screen, the result is undefined.
* @return The color of the specified pixel.
*
* @param[in] x, y The start of the text
*
* @notapi
*/
color_t GDISP_LLD(getpixelcolor)(coord_t x, coord_t y) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < 0 || x >= GDISP.Width || y < 0 || y >= GDISP.Height) return 0;
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_SCROLL && GDISP_HARDWARE_SCROLL) || defined(__DOXYGEN__)
/**
* @brief Scroll vertically a section of the screen.
* @note Optional.
* @note If x,y + cx,cy is off the screen, the result is undefined.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
*
* @param[in] x, y The start of the area to be scrolled
* @param[in] cx, cy The size of the area to be scrolled
* @param[in] lines The number of lines to scroll (Can be positive or negative)
* @param[in] bgcolor The color to fill the newly exposed area.
*
* @notapi
*/
void GDISP_LLD(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; }
if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; }
if (!lines || cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
/* Code here */
}
#endif
#if (GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL) || defined(__DOXYGEN__)
/**
* @brief Driver Control
* @detail Unsupported control codes are ignored.
* @note The value parameter should always be typecast to (void *).
* @note There are some predefined and some specific to the low level driver.
* @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t
* GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t
* GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver
* that only supports off/on anything other
* than zero is on.
* GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100.
* GDISP_CONTROL_LLD - Low level driver control constants start at
* this value.
*
* @param[in] what What to do.
* @param[in] value The value to use (always cast to a void *).
*
* @notapi
*/
void GDISP_LLD(control)(unsigned what, void *value) {
switch(what) {
case GDISP_CONTROL_POWER:
if (GDISP.Powermode == (gdisp_powermode_t)value)
return;
switch((gdisp_powermode_t)value) {
case powerOff:
/* Code here */
break;
case powerOn:
/* Code here */
/* You may need this ---
if (GDISP.Powermode != powerSleep)
GDISP_LLD(init)();
*/
break;
case powerSleep:
/* Code here */
break;
default:
return;
}
GDISP.Powermode = (gdisp_powermode_t)value;
return;
case GDISP_CONTROL_ORIENTATION:
if (GDISP.Orientation == (gdisp_orientation_t)value)
return;
switch((gdisp_orientation_t)value) {
case GDISP_ROTATE_0:
/* Code here */
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_90:
/* Code here */
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
case GDISP_ROTATE_180:
/* Code here */
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Width = GDISP_SCREEN_WIDTH;
break;
case GDISP_ROTATE_270:
/* Code here */
GDISP.Height = GDISP_SCREEN_WIDTH;
GDISP.Width = GDISP_SCREEN_HEIGHT;
break;
default:
return;
}
#if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION
GDISP.clipx0 = 0;
GDISP.clipy0 = 0;
GDISP.clipx1 = GDISP.Width;
GDISP.clipy1 = GDISP.Height;
#endif
GDISP.Orientation = (gdisp_orientation_t)value;
return;
/*
case GDISP_CONTROL_BACKLIGHT:
case GDISP_CONTROL_CONTRAST:
*/
}
}
#endif
#if (GDISP_NEED_QUERY && GDISP_HARDWARE_QUERY) || defined(__DOXYGEN__)
/**
* @brief Query a driver value.
* @detail Typecase the result to the type you want.
* @note GDISP_QUERY_WIDTH - (coord_t) Gets the width of the screen
* GDISP_QUERY_HEIGHT - (coord_t) Gets the height of the screen
* GDISP_QUERY_POWER - (gdisp_powermode_t) Get the current powermode
* GDISP_QUERY_ORIENTATION - (gdisp_orientation_t) Get the current screen orientation
* GDISP_QUERY_BACKLIGHT - (coord_t) Get the backlight state (0 to 100)
* GDISP_QUERY_CONTRAST - (coord_t) Get the contrast (0 to 100).
* GDISP_QUERY_LLD - Low level driver control constants start at
* this value.
*
* @param[in] what What to Query
*
* @notapi
*/
void *GDISP_LLD(query)(unsigned what) {
switch(what) {
case GDISP_QUERY_WIDTH: return (void *)(unsigned)GDISP.Width;
case GDISP_QUERY_HEIGHT: return (void *)(unsigned)GDISP.Height;
case GDISP_QUERY_POWER: return (void *)(unsigned)GDISP.Powermode;
case GDISP_QUERY_ORIENTATION: return (void *)(unsigned)GDISP.Orientation;
case GDISP_QUERY_BACKLIGHT: return (void *)(unsigned)GDISP.Backlight;
case GDISP_QUERY_CONTRAST: return (void *)(unsigned)GDISP.Contrast;
case GDISP_QUERY_LLD+0:
/* Code here */
default: return (void *)-1;
}
}
#endif
#if GDISP_NEED_CLIP && GDISP_HARDWARE_CLIP
void GDISP_LLD(setclip)(coord_t x, coord_t y, coord_t cx, coord_t cy) {
#if GDISP_NEED_VALIDATION
if (x >= GDISP.Width || y >= GDISP.Height || cx < 0 || cy < 0)
return;
if (x < 0) x = 0;
if (y < 0) y = 0;
if (x+cx > GDISP.Width) cx = GDISP.Width - x;
if (y+cy > GDISP.Height) cy = GDISP.Height - y;
#endif
GDISP.clipx0 = x;
GDISP.clipy0 = y;
GDISP.clipx1 = x+cx;
GDISP.clipy1 = y+cy;
/* Code here to set hardware clipping */
}
#endif
#endif /* GFX_USE_GDISP */
/** @} */

View file

@ -1,5 +0,0 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/gdisp/gdispYOURDEVICE/gdisp_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/gdisp/gdispYOURDEVICE

View file

@ -1,69 +0,0 @@
/*
ChibiOS/RT - Copyright (C) 2012
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 templates/gdisp_lld_config.h
* @brief GDISP Graphic Driver subsystem low level driver header template.
*
* @addtogroup GDISP
* @{
*/
#ifndef _GDISP_LLD_CONFIG_H
#define _GDISP_LLD_CONFIG_H
#if GFX_USE_GDISP || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver hardware support. */
/*===========================================================================*/
#define GDISP_DRIVER_NAME "YourDriverName"
#define GDISP_LLD(x) gdisp_lld_##x##_YourDriverName
#define GDISP_HARDWARE_LINES FALSE
#define GDISP_HARDWARE_CLEARS FALSE
#define GDISP_HARDWARE_FILLS FALSE
#define GDISP_HARDWARE_BITFILLS FALSE
#define GDISP_HARDWARE_CIRCLES FALSE
#define GDISP_HARDWARE_CIRCLEFILLS FALSE
#define GDISP_HARDWARE_ELLIPSES FALSE
#define GDISP_HARDWARE_ELLIPSEFILLS FALSE
#define GDISP_HARDWARE_ARCS FALSE
#define GDISP_HARDWARE_ARCFILLS FALSE
#define GDISP_HARDWARE_TEXT FALSE
#define GDISP_HARDWARE_TEXTFILLS FALSE
#define GDISP_HARDWARE_SCROLL FALSE
#define GDISP_HARDWARE_PIXELREAD FALSE
#define GDISP_HARDWARE_CONTROL FALSE
#define GDISP_HARDWARE_QUERY FALSE
#define GDISP_HARDWARE_CLIP FALSE
#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE
#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565
#define GDISP_PACKED_PIXELS FALSE
#define GDISP_PACKED_LINES FALSE
#endif /* GFX_USE_GDISP */
#endif /* _GDISP_LLD_CONFIG_H */
/** @} */

View file

@ -1,35 +0,0 @@
To use this driver template
1. Copy this entire directory (including the directory itself)
into halext/drivers
2. Rename the directory to match your hardware.
3. Customise each file in the directory including the .mk file
and this file. An example for this file is below...
4. Keep any board specific code in a file you create called
gdisp_lld_board_yourboardname.h and adjust gdisp.c to match.
This enables someone porting to a new board to add another
suitable boad definition without worrying about the rest of
the driver. See the gdispNokia6610 driver as an example.
------------------------------------------------------------------
To use this driver:
1. Add in your halconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
c) One (only) of:
#define GDISP_USE_GPIO
#define GDISP_USE_SPI
#define GDISP_USE_FSMC
d) All of the following (with appropriate values):
#define GDISP_SCREEN_WIDTH 128
#define GDISP_SCREEN_HEIGHT 128
e) If you are not using a known board then create a gdisp_lld_board.h file
and ensure it is on your include path.
Use the gdisp_lld_board_example.h file as a basis.
Currently known boards are:
XXXXXXXXX
2. To your makefile add the following lines:
include $(CHIBIOS)/os/halext/halext.mk
include $(CHIBIOS)/os/halext/drivers/gdispXXXXX/gdisp_lld.mk

View file

@ -1,9 +0,0 @@
The following low level driver templates are available:
GDISP:
gdispXXXXX - Generalised GDISP driver
TOUCHPAD:
touchpadXXXXX - Generalised TOUCHPAD driver

View file

@ -1,145 +0,0 @@
/*
ChibiOS/GFX - Copyright (C) 2012
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 touchpadXPT2046/touchpad_lld.c
* @brief Touchpad Driver subsystem low level driver source.
*
* @addtogroup TOUCHPAD
* @{
*/
#include "ch.h"
#include "hal.h"
#include "touchpad.h"
#if GFX_USE_TOUCHPAD || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/* put needed macros for your interface/driver here.
* when using SPI, macros for setting and clearing CS line
*/
#define TP_CS_HIGH palSetPad(TP_CS_PORT, TP_CS)
#define TP_CS_LOW palClearPad(TP_CS_PORT, TP_CS)
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
#if !defined(__DOXYGEN__)
TOUCHPADDriver Touchpad;
#endif
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver interrupt handlers. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
/* ---- Required Routines ---- */
/**
* @brief Low level Touchpad driver initialization.
*
* @notapi
*/
void tp_lld_init(TOUCHPADDriver *tp) {
/* do communicate with the touchpad controller
* to do any inizialisation (mostly spiStart())
*/
}
/**
* @brief Reads out the X direction.
*
* @notapi
*/
uint16_t tp_lld_read_x(void) {
uint16_t x;
/* do communicate with the touchpad controller
* to receive the X-Coordinate
*/
x = 0;
return x;
}
/*
* @brief Reads out the Y direction.
*
* @notapi
*/
uint16_t tp_lld_read_y(void) {
uint16_t y;
/* do communicate with the touchpad controller
* to receive the Y-Coordinate
*/
y = 0;
return y;
}
/* ---- Optional Routines ---- */
#if TOUCHPAD_HAS_IRQ || defined(__DOXYGEN__)
/*
* @brief for checking if touchpad is pressed or not.
*
* @return 1 if pressed / 0 if not pressed
*
* @notapi
*/
uint8_t tp_lld_irq(void) {
/* do return PEN IRQ state if your
* touchpad controller does have any
*/
return 0;
}
#endif
#if TOUCHPAD_HAS_PRESSURE || defined(__DOXYGEN__)
/*
* @brief Reads out the Z direction / pressure.
*
* @notapi
*/
uint16_t tp_lld_read_z(void) {
/* return the pressure */
return 0;
}
#endif
#endif /* GFX_USE_TOUCHPAD */
/** @} */

View file

@ -1,6 +0,0 @@
# List the required driver.
GFXSRC += $(GFXLIB)/drivers/touchpad/touchpadYOURDEVICE/touchpad_lld.c
# Required include directories
GFXINC += $(GFXLIB)/drivers/touchpad/touchpadYOURDEVICE