first graph implementation
This commit is contained in:
parent
d1f9702173
commit
5ac6912648
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
GDISP_GRAPH_SRC = $(GFXLIB)/graph/graph.c
|
||||
|
||||
GDISP_GRAPH_INC = $(GFXLIB)/graph
|
18
src/gdisp.c
18
src/gdisp.c
@ -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__)
|
||||
/**
|
||||
|
99
src/graph.c
99
src/graph.c
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user