diff options
Diffstat (limited to 'source/ct-Bot/pc/display_pc.c')
-rw-r--r-- | source/ct-Bot/pc/display_pc.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/source/ct-Bot/pc/display_pc.c b/source/ct-Bot/pc/display_pc.c new file mode 100644 index 0000000..60a7dab --- /dev/null +++ b/source/ct-Bot/pc/display_pc.c @@ -0,0 +1,175 @@ +/* + * 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 |