This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
rc2007-soccer/source/ct-Bot/pc/display_pc.c

176 lines
4.5 KiB
C
Raw Normal View History

/*
* c't-Sim - Robotersimulator fuer den c't-Bot
*
* This program 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 2 of the License, or (at your
* option) any later version.
* This program 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, write to the Free
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307, USA.
*
*/
/*! @file display_pc.c
* @brief Routinen zur Displaysteuerung
* @author Benjamin Benz (bbe@heise.de)
* @date 20.12.05
*/
#include "ct-Bot.h"
#ifdef PC
#include "display.h"
#include <stdarg.h>
#include <stdio.h>
/* definiere DISPLAY_REMOTE_AVAILABLE, wenn die Display-Daten per TCP an das
* Simulationsprogramm gesendet werden sollen. Wenn es nicht gesetzt ist,
* dann erscheint die LCD Ausgabe auf der Startkonsole */
#ifdef DISPLAY_REMOTE_AVAILABLE
#include "command.h"
#include "bot-2-sim.h"
#else
#ifdef WIN32
#include <windows.h>
#endif /* WIN32 */
#endif
#ifdef DISPLAY_AVAILABLE
/*! Puffergroesse fuer eine Zeile in bytes */
#define DISPLAY_BUFFER_SIZE (DISPLAY_LENGTH + 1)
uint8 display_update=0; /*!< Muss das Display aktualisiert werden? */
#ifdef DISPLAY_SCREENS_AVAILABLE
uint8 display_screen=0; /*!< Muss das Display aktualisiert werden? */
#endif
char display_buf[DISPLAY_BUFFER_SIZE]; /*!< Pufferstring fuer Displayausgaben */
#ifdef DISPLAY_REMOTE_AVAILABLE
#define CLEAR command_write(CMD_AKT_LCD, SUB_LCD_CLEAR, NULL, NULL,0)
#define POSITION(Ze, Sp) {Ze--; Sp--; command_write(CMD_AKT_LCD, SUB_LCD_CURSOR, (int16*)&(Sp),(int16*) &(Ze),0);}
#define printf(data) {command_write_data(CMD_AKT_LCD, SUB_LCD_DATA, NULL, NULL, (data));}
#else
#ifdef WIN32
static void clrscr(void);
static void gotoxy(int x, int y);
#define POSITION(Ze, Sp) gotoxy(Sp, Ze)
#define CLEAR clrscr()
#else
#define POSITION(Ze, Sp) printf("\033[%d;%dH",Ze,Sp) /*!< Befehl um eine Posion anzuspringen */
#define CLEAR printf("\033[2J") /*!< Befehl um das display zu loeschen */
#endif
#endif
/*!
* Loescht das ganze Display
*/
void display_clear(void){
CLEAR;
}
/*!
** LCD_Cursor: Positioniert den LCD-Cursor bei "row", "column".
*/
void display_cursor (uint8 row, uint8 column) {
int16 r=row, c=column; // Cast auf int16
POSITION(r, c);
}
/*!
* Init Display
*/
void display_init(void){
CLEAR;
}
/*!
* Zeigt einen String an
* @return -1, falls String zu Ende; 0, falls Zeile (20 Zeichen) zu Ende
*/
int display_string(char data[DISPLAY_LENGTH]){
printf(data);
return -1;
}
/*!
* Schreibt einen String auf das Display.
* @param format Format, wie beim printf
* @param ... Variable Argumentenliste, wie beim printf
*/
void display_printf(char *format, ...) {
va_list args;
/* Sicher gehen, das der zur Verfuegung stehende Puffer nicht
* ueberschrieben wird.
*/
va_start(args, format);
vsnprintf(display_buf, DISPLAY_BUFFER_SIZE, format, args);
va_end(args);
printf(display_buf);
return;
}
#ifndef DISPLAY_REMOTE_AVAILABLE
#ifdef WIN32
/*!
* Loescht die Konsole.
*/
static void clrscr(void) {
COORD coordScreen = { 0, 0 };
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD dwConSize;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter( hConsole,
TEXT(' '),
dwConSize,
coordScreen,
&cCharsWritten);
GetConsoleScreenBufferInfo(hConsole, &csbi);
FillConsoleOutputAttribute( hConsole,
csbi.wAttributes,
dwConSize,
coordScreen,
&cCharsWritten);
SetConsoleCursorPosition(hConsole, coordScreen);
return;
}
/*!
* Springt an die angegebenen Koordinaten in der Konsole.
* @param x Spalte
* @param y Zeile
*/
static void gotoxy(int x, int y) {
COORD point;
point.X = x-1; point.Y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), point);
return;
}
#endif /* WIN32 */
#endif /* !DISPLAY_REMOTE_AVAILABLE */
#endif
#endif