first graph implementation

This commit is contained in:
Joel Bodenmann 2012-10-24 02:39:21 +02:00
parent d1f9702173
commit 5ac6912648
6 changed files with 126 additions and 155 deletions

View File

@ -29,10 +29,24 @@ typedef struct _Graph {
coord_t x1;
coord_t y1;
uint16_t grid_size;
uint16_t dot_space;
bool_t full_grid;
color_t color;
} Graph;
#ifdef __cplusplus
extern "C" {
#endif
void graphDrawOneQuadrat(Graph *g);
void graphDrawFourQuadrants(Graph *g);
void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor);
#ifdef __cplusplus
}
#endif
#endif /* GFX_USE_GRAPH */
#endif

View File

@ -1,75 +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 "glcd.h"
#define MARKSIZE 5 // half
static uint16_t x, y; // origins in graph
static uint16_t grid_X, grid_Y; //grids
void graphDrawSystem(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t gridX, uint16_t gridY, uint16_t color) {
uint16_t i, length;
volatile uint16_t off;
x = x0;
y = y0;
grid_X = gridX;
grid_Y = gridY;
// X-Axis
length = x1 - x0;
lcdDrawLine(x0, y0, x1, y0, color);
lcdDrawLine(x1, y0, x1-5, y0+5, color);
lcdDrawLine(x1, y0, x1-5, y0-5, color);
for(i=1; i<(length / grid_X); i++) {
off = x0 + i * grid_X;
lcdDrawLine(off, y0-MARKSIZE, off, y0+MARKSIZE, color);
}
// Y-Axis
length = y0 - y1;
lcdDrawLine(x0, y0, x0, y1, color);
lcdDrawLine(x0, y1, x0-5, y1+5, color);
lcdDrawLine(x0, y1, x0+5, y1+5, color);
for(i=1; i<(length / grid_Y); i++) {
off = y0 + i * grid_Y;
lcdDrawLine(x0-MARKSIZE, off, x0+MARKSIZE, off, color);
}
}
void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
uint16_t i;
for(i = 0; i < entries; i++)
lcdDrawCircle(coord[i][0]+x, y-coord[i][1], radius, 1, color);
}
void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
uint16_t i;
for(i = 0; i < entries; ++i)
lcdDrawLine(coord[i-1][0]+x, y-coord[i-1][1], coord[i][0]+x, y-coord[i][1], lineColor);
for(i = 0; i < entries; ++i)
if(radius != 0)
lcdDrawCircle(coord[i][0]+x, y-coord[i][1], radius, 1, dotColor);
}

View File

@ -1,72 +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 GRAPH_H
#define GRAPH_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Description: does draw axis arrows and grid
*
* param:
* - x0, y0, x1, y1: location of arrows
* - gridX, gridY: grid size in X and Y direction
* - color: color of arrows
*
* return: none
*/
void graphDrawSystem(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t gridX, uint16_t gridY, uint16_t color);
/*
* Description: does draw coordinates into graph as dots
*
* param:
* - coord: two dimensionl array containing X and Y coordinates
* - entries: amount of coordinates passed (sizeof(coord)/sizeof(coord[0])
* - radius: size of the dots
* - color: color of the dots
*
* return: none
*/
void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color);
/*
* Description: does draw coordinates into graph connected by lines
*
* param:
* - coord: two dimensional array containing X and Y coordinates
* - entries: amount of coordinates passed (sizeof(coord)/sizeof(coord[0])
* - radius: if not 0, graphDrawDots() gets invoked
* - lineColor: color of the lines
* - dotColor: color of dots, if radius != 0
*
* return: none
*/
void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,3 +0,0 @@
GDISP_GRAPH_SRC = $(GFXLIB)/graph/graph.c
GDISP_GRAPH_INC = $(GFXLIB)/graph

View File

@ -258,9 +258,9 @@
* @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
* @param[in] color The color to use
* @param[in] x0,y0 The start position
* @param[in] x1,y1 The end position
* @param[in] color The color to use
*
* @api
*/
@ -280,6 +280,18 @@
chMBPost(&gdispMailbox, (msg_t)p, TIME_INFINITE);
}
#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__)
/**

View File

@ -25,8 +25,103 @@
#if GFX_USE_GRAPH
gfxGraphInit(struct graph_t *g) {
(void)g;
point_t origin; // origin of graph
static void swapCoordinates(coord_t *a, coord_t *b) {
coord_t temp;
temp = *b;
*b = *a;
*a = temp;
}
static void _horizontalDotLine(coord_t x0, coord_t y0, coord_t x1, uint16_t space, color_t color) {
uint16_t offset = x0;
uint16_t count = ((x1 - x0) / space);
do {
gdispDrawPixel(offset, y0, color);
offset += space;
} while(count--);
}
static void _verticalDotLine(coord_t x0, coord_t y0, coord_t y1, uint16_t space, color_t color) {
uint16_t offset = y0;
uint16_t count = ((y1 - y0) / space);
do {
gdispDrawPixel(x0, offset, color);
offset += space;
} while(count--);
}
void graphDrawOneQuadrant(Graph *g) {
if(g->x0 > g->x1)
swapCoordinates(&g->x0, &g->x1);
if(g->y0 > g->y1)
swapCoordinates(&g->y0, &g->y1);
uint16_t i;
uint16_t length_x = (g->x1 - g->x0);
uint16_t length_y = (g->y1 - g->y0);
uint16_t middle_x = (g->x1 - g->x0) / 2;
uint16_t middle_y = (g->y1 - g->y0) / 2;
origin.x = g->x0;
origin.y = g->y1;
/* X Axis */
gdispDrawLine(g->x0, g->y1, g->x1, g->y1, g->color);
for(i = 0; i <= (length_y / g->grid_size); i++)
_horizontalDotLine(g->x0, g->y0 + g->grid_size * i, g->x1, g->dot_space, g->color);
/* Y Axis */
gdispDrawLine(g->x0, g->y0, g->x0, g->y1, g->color);
for(i = 0; i <= (length_x / g->grid_size); i++)
_verticalDotLine(g->x0 + g->grid_size * i, g->y0, g->y1, g->dot_space, g->color);
}
void graphDrawFourQuadrants(Graph *g) {
if(g->x0 > g->x1)
swapCoordinates(&g->x0, &g->x1);
if(g->y0 > g->y1)
swapCoordinates(&g->y0, &g->y1);
uint16_t i;
uint16_t length_x = (g->x1 - g->x0);
uint16_t length_y = (g->y1 - g->y0);
uint16_t middle_x = (g->x1 - g->x0) / 2;
uint16_t middle_y = (g->y1 - g->y0) / 2;
origin.x = middle_x;
origin.y = middle_y;
/* X Axis */
gdispDrawLine(g->x0, middle_y, g->x1, middle_y, g->color);
for(i = 0; i <= (length_y / g->grid_size); i++)
_horizontalDotLine(g->x0, g->y0 + g->grid_size * i, g->x1, g->dot_space, g->color);
/* Y Axis */
gdispDrawLine(middle_x, g->y0, middle_x, g->y1, g->color);
for(i = 0; i <= (length_x / g->grid_size); i++)
_verticalDotLine(g->x0 + g->grid_size * i, g->y0, g->y1, g->dot_space, g->color);
}
void graphDrawDots(int coord[][2], uint16_t entries, uint16_t radius, uint16_t color) {
uint16_t i;
for(i = 0; i < entries; i++)
gdispFillCircle(coord[i][0] + origin.x, origin.y - coord[i][1], radius, color);
}
void graphDrawNet(int coord[][2], uint16_t entries, uint16_t radius, uint16_t lineColor, uint16_t dotColor) {
uint16_t i;
for(i = 0; i < entries; ++i)
gdispDrawLine(coord[i-1][0] + origin.x, origin.y - coord[i-1][1], coord[i][0] + origin.x, origin.y - coord[i][1], lineColor);
for(i = 0; i < entries; ++i)
if(radius != 0)
lcdFillCircle(coord[i][0] + origin.x, origin.y - coord[i][1], radius, dotColor);
}
#endif /* GFX_USE_GRAPH */