From 55e0a8ccaa120b16c878a0f2ff59774b03239fbf Mon Sep 17 00:00:00 2001 From: svenhoefer Date: Tue, 14 Aug 2012 22:14:22 +0200 Subject: [PATCH] * initial commit --- bmps.c | 219 +++ bmps.h | 89 ++ build.sh | 1 + color.h | 71 + convert.list | 179 +++ fb_display.c | 499 ++++++ fb_display.h | 34 + gfx.c | 291 ++++ gfx.h | 11 + gif.c | 178 +++ gif.h | 29 + gifdecomp.c | 316 ++++ gifdecomp.h | 31 + globals.h | 138 ++ http.c | 169 +++ http.h | 6 + io.c | 77 + io.h | 12 + jpeg.c | 184 +++ jpeg.h | 28 + parser.c | 570 +++++++ parser.h | 116 ++ php.c | 173 +++ php.h | 7 + plugins.mk.example | 25 + pngw.c | 176 +++ pngw.h | 28 + readme.txt | 475 ++++++ resize.c | 92 ++ resize.h | 28 + startbild.jpg | Bin 0 -> 32357 bytes starter.c | 53 + text.c | 369 +++++ text.h | 14 + translator | 90 ++ tuxwetter.c | 3598 ++++++++++++++++++++++++++++++++++++++++++++ tuxwetter.cfg | 7 + tuxwetter.conf | 452 ++++++ tuxwetter.h | 134 ++ tuxwetter.mcfg | 14 + 40 files changed, 8983 insertions(+) create mode 100644 bmps.c create mode 100644 bmps.h create mode 100644 build.sh create mode 100644 color.h create mode 100644 convert.list create mode 100644 fb_display.c create mode 100644 fb_display.h create mode 100644 gfx.c create mode 100644 gfx.h create mode 100644 gif.c create mode 100644 gif.h create mode 100644 gifdecomp.c create mode 100644 gifdecomp.h create mode 100644 globals.h create mode 100644 http.c create mode 100644 http.h create mode 100644 io.c create mode 100644 io.h create mode 100644 jpeg.c create mode 100644 jpeg.h create mode 100644 parser.c create mode 100644 parser.h create mode 100644 php.c create mode 100644 php.h create mode 100644 plugins.mk.example create mode 100644 pngw.c create mode 100644 pngw.h create mode 100644 readme.txt create mode 100644 resize.c create mode 100644 resize.h create mode 100644 startbild.jpg create mode 100644 starter.c create mode 100644 text.c create mode 100644 text.h create mode 100755 translator create mode 100644 tuxwetter.c create mode 100644 tuxwetter.cfg create mode 100755 tuxwetter.conf create mode 100644 tuxwetter.h create mode 100644 tuxwetter.mcfg diff --git a/bmps.c b/bmps.c new file mode 100644 index 0000000..290d4a1 --- /dev/null +++ b/bmps.c @@ -0,0 +1,219 @@ +/* + * $Id: bmps.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include +#include "bmps.h" +#include +#include +#include +#include +#include +#include +#include +#include "bmps.h" + + +//***************** bmp_show.c ********************** + +#define swap32bits(i) (i>>24) | (i<<24) | ((i>>8) & 0x00f0) | ((i<<8) & 0x0f00) +#define swap16bits(i) (i>>8) | (i<<8) + +int lcd_fd=-1; +lcd_packed_buffer s; + +int bmp2lcd (char *bildfile) +{ + char bild2lcd [50]; + char filename[50]; + char bmpfile[50]; + + int intbild; + + if (strstr(bildfile,"tuxwettr.bmp")==NULL) + { + if (bildfile[0] == 45) + { + sprintf (filename,"na.bmp"); + } + else + { + intbild=atoi(bildfile); + sprintf(filename,"%d.bmp",intbild); + } + } + else + { + strcpy(filename,bildfile); + } + + sprintf(bmpfile,"/share/tuxbox/tuxwetter/%s",filename); + + FILE *fbmp; + + struct bmp_header bh; + struct bmp_color *colors; + long int line_size, bmpline_size, image_size; + unsigned char *image; + + lcd_raw_buffer raw; + int mode; + + if ((fbmp = fopen(bmpfile, "r"))==NULL) { + perror("fopen(BMP_FILE)"); + return(2); + } + if (fread(&bh, 1, sizeof(bh), fbmp)!=sizeof(bh)) { + perror("fread(BMP_HEADER)"); + return(3); + } + if ((bh._B!='B')||(bh._M!='M')) { + fprintf(stderr, "Bad Magic (not a BMP file).\n"); + return(4); + } + + #if 1 + bh.file_size = swap32bits(bh.file_size); + bh.width = swap32bits(bh.width); + bh.height = swap32bits(bh.height); + bh.bit_count = swap16bits(bh.bit_count); + #endif + + // 4 * 2^bit_count + colors = malloc(4<>3); + raw[y][x] = 255*((bmp[ofs]>>(7-(x&7)))&1); + } } + break; + case 4: + for (y=0; y<64; y++) { for (x=0; x<60; x++) { + ofs = (bh.height - 1 - y)*linesize + x; + raw[y][x*2] = bmp[ofs] >> 4; + raw[y][x*2+1] = bmp[ofs] & 0x0F; + } } + break; + default: + return -1; + } + return 0; +} + + +//***************** raw.c ****************** + + + +void packed2raw(lcd_packed_buffer source, lcd_raw_buffer dest) { + int x, y, pix; + for (y=0; y<64; y++) { + for (x=0; x<120; x++) { + pix = (source[y>>3][x] >> (y&7)) & 1; + dest[y][x] = pix*255; + } + } +} +void raw2packed(lcd_raw_buffer source, lcd_packed_buffer dest) { + int x, y, y_sub, pix; + + for (y=0; y<8; y++) { + for (x=0; x<120; x++) { + pix = 0; + for (y_sub=7; y_sub>=0; y_sub--) { + pix = pix<<1; + if (source[y*8+y_sub][x]) pix++; + } + dest[y][x] = pix; + } + } +} + +void raw2raw4bit(lcd_raw_buffer source, lcd_raw4bit_buffer dest) { + int x, y; + + for (y=0; y<64; y++) { + for (x=0; x<60; x++) { + dest[y][x] = ((source[y][x*2]<<4) & 0xf0) + + (source[y][x*2+1] & 0x0f); + } + } +} diff --git a/bmps.h b/bmps.h new file mode 100644 index 0000000..cc4e2fc --- /dev/null +++ b/bmps.h @@ -0,0 +1,89 @@ +/* + * $Id: bmps.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + + + +//****************************** bmp2lcd ***************************** + +#ifndef __BMP2LCD__ +#define __BMP2LCD__ + +int bmp2lcd (char *); +void clear_lcd(void); +#endif // __BMP2LCD__ + + +//******************************** raw.h ****************************** + +#ifndef __raw__ +#define __raw__ + +struct raw_header { + short int width; + short int height; + unsigned char trans; +}__attribute((packed)); + +typedef unsigned char lcd_raw_buffer[64][120]; +typedef unsigned char lcd_packed_buffer[8][120]; +typedef unsigned char lcd_raw4bit_buffer[64][60]; + +void packed2raw(lcd_packed_buffer, lcd_raw_buffer); +void raw2packed(lcd_raw_buffer, lcd_packed_buffer); +void raw2raw4bit(lcd_raw_buffer, lcd_raw4bit_buffer); + +#endif // __raw__ + +//******************************** bmp.h ****************************** + +#ifndef __bmp__ +#define __bmp__ + +struct bmp_header { + unsigned char _B; // = 'B' + unsigned char _M; // = 'M' + long int file_size; // file size + long int reserved; // = 0 + long int data_offset; // start of raw data + // bitmap info header starts here + long int header_size; // = 40 + long int width; // = 120 + long int height; // = 64 + short int planes; // = 1 + short int bit_count; // 1..24 + long int compression; // = 0 + long int image_size; // 120*64*bitcount/8 + long int x_ppm; // X pixels/meter + long int y_ppm; // Y pixels/meter + long int colors_used; // + long int colors_vip; // important colors (all=0) +}__attribute((packed)); + +struct bmp_color { + unsigned char r, g, b, reserved; +}__attribute((packed)); + +int bmp2raw(struct bmp_header bh, unsigned char *bmp, lcd_raw_buffer raw); + +#endif // __bmp__ + + + diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..023da09 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +arm-cx2450x-linux-gnueabi-gcc -g -o tuxwetter tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c -L$PREFIX/lib -I$PREFIX/include -I$PREFIX/include/freetype2 -I$PREFIX/include/freetype2 -O2 -lfreetype -lz -ljpeg -lpng -lungif gifdecomp.c diff --git a/color.h b/color.h new file mode 100644 index 0000000..6ab843b --- /dev/null +++ b/color.h @@ -0,0 +1,71 @@ +/* + Neutrino-GUI - DBoxII-Project + + Copyright (C) 2001 Steffen Hehn 'McClean' + Homepage: http://dbox.cyberphoria.org/ + + Kommentar: + + Diese GUI wurde von Grund auf neu programmiert und sollte nun vom + Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert + auf der Client-Server Idee, diese GUI ist also von der direkten DBox- + Steuerung getrennt. Diese wird dann von Daemons uebernommen. + + + License: GPL + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + + +#ifndef __color__ +#define __color__ + +#define COL_MAXFREE 254-8*7 - 1 +#define COL_INFOBAR_SHADOW 254-8*7 +#define COL_INFOBAR 254-8*6 +#define COL_MENUHEAD 254-8*5 +#define COL_MENUCONTENT 254-8*4 +#define COL_MENUCONTENTDARK 254-8*3 +#define COL_MENUCONTENTSELECTED 254-8*2 +#define COL_MENUCONTENTINACTIVE 254-8*1 + +#define COL_BACKGROUND 255 + +#define COL_INFOBAR_SHADOW_PLUS_0 (COL_INFOBAR_SHADOW + 0) +#define COL_INFOBAR_SHADOW_PLUS_1 (COL_INFOBAR_SHADOW + 1) +#define COL_INFOBAR_PLUS_0 (COL_INFOBAR + 0) +#define COL_INFOBAR_PLUS_1 (COL_INFOBAR + 1) +#define COL_INFOBAR_PLUS_3 (COL_INFOBAR + 3) +#define COL_INFOBAR_PLUS_7 (COL_INFOBAR + 7) +#define COL_MENUHEAD_PLUS_0 (COL_MENUHEAD + 0) +#define COL_MENUCONTENT_PLUS_0 (COL_MENUCONTENT + 0) +#define COL_MENUCONTENT_PLUS_1 (COL_MENUCONTENT + 1) +#define COL_MENUCONTENT_PLUS_2 (COL_MENUCONTENT + 2) +#define COL_MENUCONTENT_PLUS_3 (COL_MENUCONTENT + 3) +#define COL_MENUCONTENT_PLUS_4 (COL_MENUCONTENT + 4) +#define COL_MENUCONTENT_PLUS_5 (COL_MENUCONTENT + 5) +#define COL_MENUCONTENT_PLUS_6 (COL_MENUCONTENT + 6) +#define COL_MENUCONTENT_PLUS_7 (COL_MENUCONTENT + 7) +#define COL_MENUCONTENTDARK_PLUS_0 (COL_MENUCONTENTDARK + 0) +#define COL_MENUCONTENTDARK_PLUS_2 (COL_MENUCONTENTDARK + 2) +#define COL_MENUCONTENTSELECTED_PLUS_0 (COL_MENUCONTENTSELECTED + 0) +#define COL_MENUCONTENTSELECTED_PLUS_2 (COL_MENUCONTENTSELECTED + 2) +#define COL_MENUCONTENTINACTIVE_PLUS_0 (COL_MENUCONTENTINACTIVE + 0) +#define COL_BACKGROUND_PLUS_0 (COL_BACKGROUND + 0) + +enum { COL_WHITE=0x60, COL_RED, COL_GREEN, COL_BLUE, COL_YELLOW, COL_BLACK }; + +#endif diff --git a/convert.list b/convert.list new file mode 100644 index 0000000..dc2b878 --- /dev/null +++ b/convert.list @@ -0,0 +1,179 @@ +BLIZZARD|Schneesturm +BLOWING SNOW|Schneeverwehungen +CLEAR/SUNNY|sonnig und klar +CLOUDY |wolkig +FOG|Nebel +FREEZING DRIZZLE|gefrierender Nieselregen +FREEZING FOG|gefrierender Nebel +HEAVY FREEZING DRIZZLE|starker gefrierender Nieselregen +HEAVY RAIN|starker Regen +HEAVY SNOW|starker Schneefall +ICE PELLETS|Hagel +LIGHT DRIZZLE|leichter Nieselregen +LIGHT FREEZING RAIN|leichter gefrierender Regen +LIGHT RAIN SHOWER|leichter Regenschauer +LIGHT RAIN|leichter Regen +LIGHT SHOWERS OF ICE PELLETS|leichter Hagel +LIGHT SLEET SHOWERS|leichter Graupelschauer +LIGHT SLEET|leichter Graupel +LIGHT SNOW SHOWERS|leichter Schneeschauer +LIGHT SNOW|leichter Schneefall +MIST|Dunst +MODERATE OR HEAVY FREEZING RAIN|mäßig gefrierender Regen +MODERATE OR HEAVY RAIN IN AREA WITH THUNDER|mäßiger Regen/vereinzelt Gewitter +MODERATE OR HEAVY RAIN SHOWER|mäßiger Regenschauer +MODERATE OR HEAVY SHOWERS OF ICE PELLETS|mäßiger Hagel +MODERATE OR HEAVY SLEET SHOWERS|mäßiger Graupelschauer +MODERATE OR HEAVY SLEET|mäßiger Graupel +MODERATE OR HEAVY SNOW IN AREA WITH THUNDER|mäßiger Schneefall/vereinzelt Gewitter +MODERATE OR HEAVY SNOW SHOWERS|mäßige Schneeschauer +MODERATE RAIN AT TIMES|vereinzelt mäßiger Regen +MODERATE RAIN|mäßiger Regen +MODERATE SNOW|mäßiger Schnee +OVERCAST |bedeckt +PARTLY CLOUDY |teilweise bewölkt +PATCHY FREEZING DRIZZLE NEARBY|ungleichmäßiger gefrierender Nieselregen +PATCHY HEAVY SNOW|ungleichmäßiger schwerer Schneefall +PATCHY LIGHT DRIZZLE|ungleichmäßiger leichter Nieselregen +PATCHY LIGHT RAIN IN AREA WITH THUNDER|ungleichmäßiger leichter Regen/vereinzelt Gewitter +PATCHY LIGHT RAIN|ungleichmäßiger leichter Regen +PATCHY LIGHT SNOW IN AREA WITH THUNDER|ungleichmäßiger leichter Schneefall/vereinzelt Gewitter +PATCHY LIGHT SNOW|ungleichmäßiger leichter Schneefall +PATCHY MODERATE SNOW|ungleichmäßiger mäßiger Schneefall +PATCHY RAIN NEARBY|vereinzelt ungleichmäßiger Regen +PATCHY SLEET NEARBY|vereinzelt ungleichmäßiger Graupel +PATCHY SNOW NEARBY|vereinzelt ungleichmäßiger Schneefall +SUNNY|sonnig +THUNDERY OUTBREAKS IN NEARBY|vereinzelt Gewitter +TORRENTIAL RAIN SHOWER|heftiger Regenschauer +# +E|Ost +ENE|OstNordOst +ESE|OstSüdOst +N|Nord +NE|NordOst +NNE|NordNordOst +NNW|NordNordWest +NW|NordWest +S|Süd +SE|SüdOst +SSE|SüdSüdOst +SSW|SüdSüdWest +SW|SüdWest +W|West +WNW|WestNordWest +WSW|WestSüdWest +# +MONDAY|Montag +TUESDAY|Dienstag +WEDNESDAY|Mittwoch +THURSDAY|Donnerstag +FRIDAY|Freitag +SATURDAY|Samstag +SUNDAY|Sonntag +# +MONDAY_SIG|Mo +TUESDAY_SIG|Di +WEDNESDAY_SIG|Mi +THURSDAY_SIG|Do +FRIDAY_SIG|Fr +SATURDAY_SIG|Sa +SUNDAY_SIG|So +# +#Lokalisierung der Bildschirmanzeige +# +Januar| +Februar| +März| +April| +Mai| +Juni| +Juli| +August| +September| +Oktober| +November| +Dezember| +# +Aktuelle Anzeige schließen| +Aktuelle Uhrzeit:| +Aktuelles Wetter| +Aktuelles Wetter| +Animation wiederholen| +Bedingung:| +beim Download| +Bild| +Bitte warten| +Bitte warten| +Breitengrad:| +CS-Tuxwetter beenden| +Datei kann nicht angezeigt werden.| +Direktanwahl Funktionen 1-4| +Direktanwahl Funktionen 5-10| +eine Seite vorblättern| +eine Seite zurückblättern| +Farbtasten Rot, Grün, Gelb, Blau| +fehlende Übersetzungen anzeigen| +Fehlende Übersetzungen| +Fehler| +Fehlliste löschen| +Fernsicht:| +Formatfehler der URL in der tuxwetter.conf| +gefühlt:| +Heute| +Hoch| +Höchste Temperatur:| +Höchstwerte| +Home| +Kein Eintrag| +Keine Daten vom Wetterserver erhalten!| +Keine fehlenden Übersetzungen| +Längengrad:| +Links (bei mehrseitigen Menüs)| +Links (in Bildanzeige)| +Luftdruck:| +Luftfeuchtigkeit:| +Menüpunkt ausführen| +Menü-Taste (im Hauptmenü)| +mit| +Mondphase:| +nächsten Eintrag anzeigen| +nächster Menüeintrag| +Nachtwerte| +neu downloaden (für WebCams)| +Nicht unterstütztes Dateiformat| +OK/Home| +OK| +Ortszeit:| +Rechts (bei Ani-GIF's)| +Rechts (bei mehrseitigen Menüs)| +Regenrisiko:| +Rot (in fehlenden Übersetzungen)| +Runter| +Sonnenaufgang:| +Sonnenuntergang:| +Standby-Taste| +Standort:| +Steuertasten in Daten- und Grafikanzeige| +Steuertasten in den Menüs| +Tageswerte| +Taupunkt:| +Temperatur:| +Tiefste Temperatur:| +Tiefstwerte| +Trend für die kommende Woche| +Uhr| +Ungültige Daten aus tuxwetter.conf| +UV-Index:| +von| +vorherigen Eintrag anzeigen| +vorheriger Menüeintrag| +Vorschau für| +Wetterdaten für| +Wind:| +windstill| +Wochentrend anzeigen| +Wochentrend| +Zeitpunkt der Messung:| +Zifferntasten 1-6| +zurück zum vorigen Menü| diff --git a/fb_display.c b/fb_display.c new file mode 100644 index 0000000..4129986 --- /dev/null +++ b/fb_display.c @@ -0,0 +1,499 @@ +/* + * $Id: fb_display.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +//#include "config.h" +#include +#include +#ifdef HAVE_DBOX_HARDWARE +#include +#endif +#include "tuxwetter.h" +#include "parser.h" +//#include "bmps.h" +#include "text.h" +#include "io.h" +#include "gfx.h" +#include "fb_display.h" + +#define FB_DEVICE "/dev/fb/0" + +/* Public Use Functions: + * + * extern void fb_display(unsigned char *rgbbuff, + * int x_size, int y_size, + * int x_pan, int y_pan, + * int x_offs, int y_offs); + * + * extern void getCurrentRes(int *x,int *y); + * + */ + +//static unsigned short rd[] = {0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0xFF<<8}; +//static unsigned short gn[] = {0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xFF<<8, 0xFF<<8, 0x00<<8}; +//static unsigned short bl[] = {0xFF<<8, 0xFF<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8}; +//static unsigned short tr[] = {0x0000, 0x0A00, 0x0A00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +//static struct fb_cmap map_back = {0, 256, red_b, green_b, blue_b, NULL}; +// static unsigned short red_b[256], green_b[256], blue_b[256]; + +static unsigned short red[256], green[256], blue[256], transp[256]; +static struct fb_cmap map332 = {0, 256, red, green, blue, NULL}; +extern int fbd; // Framebuffer device +extern unsigned char *lfb; +extern unsigned int alpha; +static int gbpp, gccp, gmode_on=0; +static struct fb_fix_screeninfo fix; +//static struct fb_cmap colormap = {1, 8, rd, gn, bl, tr}; + +typedef struct pixelformat{ + char *name; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + char bpp; + char pixenum; + }spix; + + +const struct pixelformat gpix = { + .name = "RGB565", // RGB565 + .bpp = 16, .pixenum = 2, + .red = { .offset = 11, .length=5, .msb_right =0 }, + .green = { .offset = 5, .length=6, .msb_right =0 }, + .blue = { .offset = 0, .length=5, .msb_right =0 }, + .transp= { .offset = 0, .length=0, .msb_right =0 }, + }; + +int openFB(const char *name); +void getFixScreenInfo(struct fb_fix_screeninfo *fix); +int set332map(void); +void blit2FB(void *fbbuff, + unsigned int pic_xs, unsigned int pic_ys, + unsigned int scr_xs, unsigned int scr_ys, + unsigned int xp, unsigned int yp, + unsigned int xoffs, unsigned int yoffs, + int cpp, int setpal); + +inline unsigned short make16color(unsigned long r, unsigned long g, + unsigned long b, unsigned long rl, + unsigned long ro, unsigned long gl, + unsigned long go, unsigned long bl, + unsigned long bo, unsigned long tl, + unsigned long to); + +int fb_set_gmode(int gmode) +{ + struct fb_var_screeninfo var; + + if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1) + { + printf("fb_display \n"); + return -1; + } + + struct fb_fix_screeninfo fix; + + if (ioctl(fb, FBIOGET_FSCREENINFO, &fix)<0) { + perror("FBIOGET_FSCREENINFO"); + return -1; + } + +// memset(lfb, 0, stride * yRes); + if (ioctl(fb, FBIOBLANK, FB_BLANK_UNBLANK) < 0) { + printf("screen unblanking failed\n"); + } + + gmode_on=gmode; + return 0; +} + + +void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int setpal) +{ + struct fb_var_screeninfo var; + unsigned short *fbbuff = NULL; + int bp = 0; + if(rgbbuff==NULL) + return; + + if(ioctl(fb, FBIOGET_FSCREENINFO, &fix) == -1) + { + printf("fb_display \n"); + return; + } + + if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1) + { + printf("fb_display \n"); + return; + } + + /* correct panning */ + if(x_pan > x_size - (int)var.xres) x_pan = 0; + if(y_pan > y_size - (int)var.yres) y_pan = 0; + /* correct offset */ + if(x_offs + x_size > (int)var.xres) x_offs = 0; + if(y_offs + y_size > (int)var.yres) y_offs = 0; + + /* blit buffer 2 fb */ + fbbuff = (unsigned short *) convertRGB2FB(rgbbuff, x_size * y_size, var.bits_per_pixel, &bp); + if(fbbuff==NULL) + return; + /* ClearFB if image is smaller */ + if(clearflag) + clearFB(0,0,var.bits_per_pixel, bp); + blit2FB(fbbuff, x_size, y_size, var.xres, var.yres, x_pan, y_pan, x_offs, y_offs, bp, setpal); + free(fbbuff); + gbpp=bp; + gccp=var.bits_per_pixel; +} + +void getCurrentRes(int *x, int *y) +{ + struct fb_var_screeninfo tvar; + ioctl(fb, FBIOGET_VSCREENINFO, &tvar); + *x = tvar.xres; + *y = tvar.yres; +} + +void make332map(struct fb_cmap *map) +{ + unsigned short rd[] = {0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, + 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0xFF<<8}; + unsigned short gn[] = {0xFF<<8, 0x80<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0xC0<<8, 0x00<<8, + 0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, 0xC0<<8, 0xFF<<8, 0xFF<<8, 0x00<<8}; + unsigned short bl[] = {0xFF<<8, 0xFF<<8, 0xFF<<8, 0x80<<8, 0xFF<<8, 0x80<<8, 0x00<<8, 0x80<<8, + 0xFF<<8, 0xFF<<8, 0x00<<8, 0xFF<<8, 0x00<<8, 0x00<<8, 0x00<<8, 0x00<<8}; + unsigned short tr[] = {0x0000, 0x0A00, 0x0000, 0x0A00, 0x0000, 0x0A00, 0x0000, 0x0000, + 0x0000, 0x0A00, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + + int rs, gs, bs, i; + int r = 8, g = 8, b = 4; + + map->red = red; + map->green = green; + map->blue = blue; + map->transp = transp; + + rs = 256 / (r - 1); + gs = 256 / (g - 1); + bs = 256 / (b - 1); + + for (i = 0; i < 256; i++) { + map->red[i] = (rs * ((i / (g * b)) % r)) * 255; + map->green[i] = (gs * ((i / b) % g)) * 255; + map->blue[i] = (bs * ((i) % b)) * 255; + map->transp[i] = 0x0000; + } + + // set system-colors + for (i = 0; i < 16; i++) { + map->red[i] = rd[i]; + map->green[i] = gn[i]; + map->blue[i] = bl[i]; + map->transp[i] = tr[i]; + } + +} + +int set332map(void) +{ + make332map(&map332); + return ioctl(fb, FBIOPUTCMAP, &map332); +} + +void blit2FB(void *fbbuff, + unsigned int pic_xs, unsigned int pic_ys, + unsigned int scr_xs, unsigned int scr_ys, + unsigned int xp, unsigned int yp, + unsigned int xoffs, unsigned int yoffs, + int cpp, int setpal) +{ + int i, xc, yc; + unsigned char *cp; unsigned short *sp; unsigned int *ip; + ip = (unsigned int *) fbbuff; + sp = (unsigned short *) ip; + cp = (unsigned char *) sp; + + xc = (pic_xs > scr_xs) ? scr_xs : pic_xs; + yc = (pic_ys > scr_ys) ? scr_ys : pic_ys; + + unsigned int stride = fix.line_length; + + switch(cpp){ + case 1: + if(setpal) + { + set332map(); + } + for(i = 0; i < yc; i++){ + memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,cp + (i+yp)*pic_xs+xp,xc*cpp); + } + break; + case 2: + for(i = 0; i < yc; i++){ + memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,sp + (i+yp)*pic_xs+xp, xc*cpp); + } + break; + case 4: + for(i = 0; i < yc; i++){ + memcpy(lfb+(i+yoffs)*stride+xoffs*cpp,ip + (i+yp)*pic_xs+xp, xc*cpp); + } + break; + } +} + + +void clearFB(int cfx, int cfy, int bpp, int cpp) +{ +int x,y; + + if(cfx<=0 || cfy<=0) + { + getCurrentRes(&x,&y); + } + else + { + x=cfx; + y=cfy; + } + + unsigned int stride = fix.line_length; + + switch(cpp){ + case 2: + { + unsigned long rl, ro, gl, go, bl, bo, tl, to; + unsigned int i; + struct fb_var_screeninfo tvar; + ioctl(fb, FBIOGET_VSCREENINFO, &tvar); + rl = tvar.red.length; + ro = tvar.red.offset; + gl = tvar.green.length; + go = tvar.green.offset; + bl = tvar.blue.length; + bo = tvar.blue.offset; + tl = tvar.transp.length; + to = tvar.transp.offset; + short black=make16color(0,0,0, rl, ro, gl, go, bl, bo, tl, to); + unsigned short *s_fbbuff = (unsigned short *) malloc(y*stride/2 * sizeof(unsigned short)); + if(s_fbbuff==NULL) + { + printf("Error: malloc\n"); + return; + } + + for(i = 0; i < y*stride/2; i++) + s_fbbuff[i] = black; + memcpy(lfb, s_fbbuff, y*stride); + free(s_fbbuff); + } + break; + case 4: + { + unsigned int col = 0xFF000000; + unsigned int * dest = (unsigned int *) lfb; + unsigned int i; + for(i = 0; i < stride*y/4; i ++) + dest[i] = col; + } + break; + + default: + memset(lfb, 0, stride*y); + } + +} + +void closeFB(void) +{ + clearFB(0, 0, gbpp, gccp); +} + +inline unsigned char make8color(unsigned char r, unsigned char g, unsigned char b) +{ + return ( + (((r >> 5) & 7) << 5) | + (((g >> 5) & 7) << 2) | + ((b >> 6) & 3) ); +} + +inline unsigned short make15color(unsigned char r, unsigned char g, unsigned char b) +{ + return ( + (((b >> 3) & 31) << 10) | + (((g >> 3) & 31) << 5) | + ((r >> 3) & 31) ); +} + +inline unsigned short make16color(unsigned long r, unsigned long g, unsigned long b, + unsigned long rl, unsigned long ro, + unsigned long gl, unsigned long go, + unsigned long bl, unsigned long bo, + unsigned long tl, unsigned long to) +{ + return ( +// ((0xFF >> (8 - tl)) << to) | + ((r >> (8 - rl)) << ro) | + ((g >> (8 - gl)) << go) | + ((b >> (8 - bl)) << bo)); +} + +void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp) +{ + unsigned long i; + void *fbbuff = NULL; + unsigned char *c_fbbuff; + unsigned short *s_fbbuff; + unsigned int *i_fbbuff; + unsigned long rl, ro, gl, go, bl, bo, tl, to; + + struct fb_var_screeninfo tvar; + ioctl(fb, FBIOGET_VSCREENINFO, &tvar); + rl = tvar.red.length; + ro = tvar.red.offset; + gl = tvar.green.length; + go = tvar.green.offset; + bl = tvar.blue.length; + bo = tvar.blue.offset; + tl = tvar.transp.length; + to = tvar.transp.offset; + + switch(bpp) + { + case 8: + *cpp = 1; + c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char)); + if(c_fbbuff==NULL) + { + printf("Error: malloc\n"); + return NULL; + } + for(i = 0; i < count; i++) + c_fbbuff[i] = make8color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + fbbuff = (void *) c_fbbuff; + break; + case 15: + *cpp = 2; + s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); + if(s_fbbuff==NULL) + { + printf("Error: malloc\n"); + return NULL; + } + for(i = 0; i < count ; i++) + s_fbbuff[i] = make15color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2]); + fbbuff = (void *) s_fbbuff; + break; + case 16: + *cpp = 2; + s_fbbuff = (unsigned short *) malloc(count * sizeof(unsigned short)); + if(s_fbbuff==NULL) + { + printf("Error: malloc\n"); + return NULL; + } + for(i = 0; i < count ; i++) + s_fbbuff[i]=make16color(rgbbuff[i*3], rgbbuff[i*3+1], rgbbuff[i*3+2], rl, ro, gl, go, bl, bo, tl, to); + fbbuff = (void *) s_fbbuff; + break; + case 24: + case 32: + *cpp = 4; + i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int)); + if(i_fbbuff==NULL) + { + printf("Error: malloc\n"); + return NULL; + } + for(i = 0; i < count ; i++) + i_fbbuff[i] = (/*transp*/0xFF << 24) | ((rgbbuff[i*3] << 16) & 0xFF0000) | ((rgbbuff[i*3+1] << 8) & 0xFF00) | (rgbbuff[i*3+2] & 0xFF); + + fbbuff = (void *) i_fbbuff; + break; + default: + fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n", bpp); + exit(1); + } + return fbbuff; +} + + + + +int showBusy(int sx, int sy, int width, char r, char g, char b) +{ + unsigned char rgb_buffer[3]; + unsigned char* fb_buffer; + unsigned char* m_busy_buffer=NULL; + unsigned char* busy_buffer_wrk; + int cpp; + struct fb_fix_screeninfo fix; + if(ioctl(fb, FBIOGET_FSCREENINFO, &fix) == -1) + { + printf("fb_display \n"); + return -1; + } + + struct fb_var_screeninfo var; + if(ioctl(fb, FBIOGET_VSCREENINFO, &var) == -1) + { + printf("fb_display \n"); + return -1; + } + var.bits_per_pixel = gpix.bpp; + + rgb_buffer[0]=r; + rgb_buffer[1]=g; + rgb_buffer[2]=b; + + fb_buffer = (unsigned char*) convertRGB2FB(rgb_buffer, 1, var.bits_per_pixel, &cpp); + if(fb_buffer==NULL) + { + printf("Error: malloc\n"); + return -1; + } + if(m_busy_buffer!=NULL) + { + free(m_busy_buffer); + m_busy_buffer=NULL; + } + m_busy_buffer = (unsigned char*) malloc(width*width*cpp); + if(m_busy_buffer==NULL) + { + printf("Error: malloc\n"); + return -1; + } + busy_buffer_wrk = m_busy_buffer; + unsigned int stride = fix_screeninfo.line_length*2; + + int y=0, x=0; + for(y=sy ; y < sy+width; y++) + { + for(x=sx ; x< sx+width; x++) + { + memcpy(busy_buffer_wrk, lfb + y * stride + x*cpp, cpp); + busy_buffer_wrk+=cpp; + memcpy(lfb + y * stride + x*cpp, fb_buffer, cpp); + } + } +return 0; +} diff --git a/fb_display.h b/fb_display.h new file mode 100644 index 0000000..b29b3d6 --- /dev/null +++ b/fb_display.h @@ -0,0 +1,34 @@ +/* + * $Id: fb_display.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#ifndef __pictureviewer_fbdisplay__ +#define __pictureviewer_fbdisplay__ +void* convertRGB2FB(unsigned char *rgbbuff, unsigned long count, int bpp, int *cpp); +void fb_display(unsigned char *rgbbuff, int x_size, int y_size, int x_pan, int y_pan, int x_offs, int y_offs, int clearflag, int transp); +int fb_set_gmode(int gmode); +void getCurrentRes(int *x,int *y); +void clearFB(int cfx, int cfy, int bpp, int cpp); +void closeFB(void); + +int showBusy(int sx, int sy, int width, char r, char g, char b); + + +#endif diff --git a/gfx.c b/gfx.c new file mode 100644 index 0000000..3f40c34 --- /dev/null +++ b/gfx.c @@ -0,0 +1,291 @@ +//getline needed #define _GNU_SOURCE +#define _GNU_SOURCE + +#include "tuxwetter.h" +#include "gfx.h" + +typedef struct { unsigned char width_lo; unsigned char width_hi; unsigned char height_lo; unsigned char height_hi; unsigned char transp; } IconHeader; + +char circle[] = +{ + 0,0,0,0,0,1,1,0,0,0,0,0, + 0,0,0,1,1,1,1,1,1,0,0,0, + 0,0,1,1,1,1,1,1,1,1,0,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,1,1,1,1,1,1,1,1,1,1,0, + 0,0,1,1,1,1,1,1,1,1,0,0, + 0,0,0,1,1,1,1,1,1,0,0,0, + 0,0,0,0,0,1,1,0,0,0,0,0 +}; + +void Center_Screen(int wx, int wy, int *csx, int *csy) +{ + *csx = ((ex-sx) - wx)/2; + *csy = ((ey-sy) - wy)/2; +} + +/****************************************************************************** + * RenderBox + ******************************************************************************/ +void RenderBox(int rsx, int rsy, int rex, int rey, int rad, int col) +{ + int F,R=rad,ssx=sx+rsx,ssy=sy+rsy,dxx=rex,dyy=rey,rx,ry,wx,wy,count; + + unsigned char *pos=(lbb+(ssx<<2)+fix_screeninfo.line_length*ssy); + unsigned char *pos0, *pos1, *pos2, *pos3, *i; + unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]}; + + if (dxx<0) + { + printf("[shellexec] RenderBox called with dx < 0 (%d)\n", dxx); + dxx=0; + } + + if(R) + { + if(--dyy<=0) + { + dyy=1; + } + + if(R==1 || R>(dxx/2) || R>(dyy/2)) + { + R=dxx/10; + F=dyy/10; + if(R>F) + { + if(R>(dyy/3)) + { + R=dyy/3; + } + } + else + { + R=F; + if(R>(dxx/3)) + { + R=dxx/3; + } + } + } + ssx=0; + ssy=R; + F=1-R; + + rx=R-ssx; + ry=R-ssy; + + pos0=pos+((dyy-ry)*fix_screeninfo.line_length); + pos1=pos+(ry*fix_screeninfo.line_length); + pos2=pos+(rx*fix_screeninfo.line_length); + pos3=pos+((dyy-rx)*fix_screeninfo.line_length); + while (ssx <= ssy) + { + rx=R-ssx; + ry=R-ssy; + wx=rx<<1; + wy=ry<<1; + + for(i=pos0+(rx<<2); i\n", filename); + return; + } + + read(fd, &iheader, sizeof(IconHeader)); + + width = (iheader.width_hi << 8) | iheader.width_lo; + height = (iheader.height_hi << 8) | iheader.height_lo; + + + for (count=0; count> 1 ); + pixpos = (unsigned char*) &pixbuf; + d2 = d; + for (count2=0; count2> 1; count2 ++ ) + { + compressed = *pixpos; + pix1 = (compressed & 0xf0) >> 4; + pix2 = (compressed & 0x0f); + + if (pix1 != iheader.transp) + { + *d2=pix1 + offset; + } + d2++; + if (pix2 != iheader.transp) + { + *d2=pix2 + offset; + } + d2++; + pixpos++; + } + d += var_screeninfo.xres; + } + close(fd); + return; +} +#endif +/****************************************************************************** + * RenderLine + ******************************************************************************/ + +void RenderLine( int xa, int ya, int xb, int yb, unsigned char col ) +{ + int dx; + int dy; + int x; + int y; + int End; + int step; + unsigned char pix[4]={bl[col],gn[col],rd[col],tr[col]}; + + dx = abs (xa - xb); + dy = abs (ya - yb); + + if ( dx > dy ) + { + int p = 2 * dy - dx; + int twoDy = 2 * dy; + int twoDyDx = 2 * (dy-dx); + + if ( xa > xb ) + { + x = xb; + y = yb; + End = xa; + step = ya < yb ? -1 : 1; + } + else + { + x = xa; + y = ya; + End = xb; + step = yb < ya ? -1 : 1; + } + + memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + + while( x < End ) + { + x++; + if ( p < 0 ) + p += twoDy; + else + { + y += step; + p += twoDyDx; + } + memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + } + } + else + { + int p = 2 * dx - dy; + int twoDx = 2 * dx; + int twoDxDy = 2 * (dx-dy); + + if ( ya > yb ) + { + x = xb; + y = yb; + End = ya; + step = xa < xb ? -1 : 1; + } + else + { + x = xa; + y = ya; + End = yb; + step = xb < xa ? -1 : 1; + } + + memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + + while( y < End ) + { + y++; + if ( p < 0 ) + p += twoDx; + else + { + x += step; + p += twoDxDy; + } + memcpy(lbb + (startx+x)*4 + fix_screeninfo.line_length*(y+starty), pix, sizeof(pix)); + } + } +} + + diff --git a/gfx.h b/gfx.h new file mode 100644 index 0000000..64ada4b --- /dev/null +++ b/gfx.h @@ -0,0 +1,11 @@ +#ifndef __GFX_H__ + +#define __GFX_H__ + +void Center_Screen(int wx, int wy, int *csx, int *csy); +void RenderBox(int sx, int sy, int ex, int ey, int mode, int color); +//void PaintIcon(char *filename, int x, int y, unsigned char offset); +void RenderLine( int xa, int ya, int xb, int yb, unsigned char farbe ); +void RenderCircle(int sx, int sy, int col); + +#endif diff --git a/gif.c b/gif.c new file mode 100644 index 0000000..a93da78 --- /dev/null +++ b/gif.c @@ -0,0 +1,178 @@ +/* + * $Id: gif.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FH_ERROR_OK 0 +#define FH_ERROR_FILE 1 /* read/access error */ +#define FH_ERROR_FORMAT 2 /* file format error */ +#define FH_ERROR_MALLOC 3 /* error during malloc */ +#define min(a,b) ((a) < (b) ? (a) : (b)) +#define gflush return(FH_ERROR_FILE); +#define grflush { DGifCloseFile(gft); return(FH_ERROR_FORMAT); } +#define mgrflush { free(lb); free(slb); DGifCloseFile(gft); return(FH_ERROR_FORMAT); } +#define agflush return(FH_ERROR_FORMAT); +#define agrflush { DGifCloseFile(gft); return(FH_ERROR_FORMAT); } + +int fh_gif_id(const char *name) +{ + int fd; + char id[4]; + fd=open(name,O_RDONLY); if(fd==-1) return(0); + read(fd,id,4); + close(fd); + if(id[0]=='G' && id[1]=='I' && id[2]=='F') return(1); + return(0); +} + +inline void m_rend_gif_decodecolormap(unsigned char *cmb,unsigned char *rgbb,ColorMapObject *cm,int s,int l) +{ + GifColorType *cmentry; + int i; + for(i=0;iColors[cmb[i]]; + *(rgbb++)=cmentry->Red; + *(rgbb++)=cmentry->Green; + *(rgbb++)=cmentry->Blue; + } +} +int fh_gif_load(const char *name,unsigned char *buffer,int x,int y) +{ + int px,py,i,ibxs; + int j; + unsigned char *fbptr; + unsigned char *lb; + unsigned char *slb; + GifFileType *gft; + GifByteType *extension; + int extcode; + GifRecordType rt; + ColorMapObject *cmap; + int cmaps; + + gft=DGifOpenFileName(name); + if(gft==NULL) gflush; + do + { + if(DGifGetRecordType(gft,&rt) == GIF_ERROR) grflush; + switch(rt) + { + case IMAGE_DESC_RECORD_TYPE: + + if(DGifGetImageDesc(gft)==GIF_ERROR) grflush; + px=gft->Image.Width; + py=gft->Image.Height; + lb=(unsigned char*)malloc(px*3); + slb=(unsigned char*) malloc(px); + if(lb!=NULL && slb!=NULL) + { + cmap=(gft->Image.ColorMap ? gft->Image.ColorMap : gft->SColorMap); + cmaps=cmap->ColorCount; + + ibxs=ibxs*3; + fbptr=buffer; + if(!(gft->Image.Interlace)) + { + for(i=0;iImage.Width; + py=gft->Image.Height; + *x=px; *y=py; + DGifCloseFile(gft); + return(FH_ERROR_OK); + break; + case EXTENSION_RECORD_TYPE: + if(DGifGetExtension(gft,&extcode,&extension)==GIF_ERROR) grflush; + while(extension!=NULL) + if(DGifGetExtensionNext(gft,&extension)==GIF_ERROR) grflush; + break; + default: + break; + } + } + while( rt!= TERMINATE_RECORD_TYPE ); + DGifCloseFile(gft); + return(FH_ERROR_FORMAT); +} diff --git a/gif.h b/gif.h new file mode 100644 index 0000000..ff9bf02 --- /dev/null +++ b/gif.h @@ -0,0 +1,29 @@ +/* + * $Id: gif.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#ifndef __GIF_H__ +#define __GIF_H__ + +int fh_gif_id(const char *name); +int fh_gif_load(const char *name,unsigned char *buffer,int x,int y); +int fh_gif_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height); + +#endif diff --git a/gifdecomp.c b/gifdecomp.c new file mode 100644 index 0000000..4e81e18 --- /dev/null +++ b/gifdecomp.c @@ -0,0 +1,316 @@ +/* + * $Id: gifdecomp.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#define HAVE_VARARGS_H +#include +#include +#include +#include +#include +#include "gif_lib.h" +#include "gifdecomp.h" + +#define PROGRAM_NAME "GifDecomp" +#define GIF_ASM_NAME "Tuxwetter" +#define COMMENT_GIF_ASM "New-Tuxwetter-Team" +#define SQR(x) ((x) * (x)) + +static int + ImageNum = 0, + InterlacedFlag = FALSE, + InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */ + InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */ + +int LoadImage(GifFileType *GifFile, GifRowType **ImageBuffer); +int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer); + + +void xremove(char *fname); + +/****************************************************************************** +* Perform the disassembly operation - take one input files into few output. * +******************************************************************************/ +int gifdecomp(char *InFileName, char *OutFileName) +{ +int i; + + GifRowType *ImageBuffer; + char TempGifName[80]; + sprintf (TempGifName,"/tmp/tempgif.gif"); + int ExtCode, CodeSize, FileNum = 0, FileEmpty; + GifRecordType RecordType; + char CrntFileName[80]; + char tempout[80]; + GifByteType *Extension, *CodeBlock; + GifFileType *GifFileIn = NULL, *GifFileOut = NULL; + for(i=0; i<32; i++) + { + sprintf(tempout,"%s%02d.gif",OutFileName,i); + xremove(tempout); + } + xremove(TempGifName); + /* Open input file: */ + if (InFileName != NULL) + { + if ((GifFileIn = DGifOpenFileName(InFileName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + } + if ((GifFileIn = DGifOpenFileName(InFileName)) != NULL) + { + if ((GifFileOut = EGifOpenFileName(TempGifName, TRUE)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + + if (EGifPutScreenDesc(GifFileOut, + GifFileIn->SWidth, GifFileIn->SHeight, + GifFileIn->SColorResolution, GifFileIn->SBackGroundColor, + GifFileIn->SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Scan the content of the GIF file and load the image(s) in: */ + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Put the image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn->Image.Left, GifFileIn->Image.Top, + GifFileIn->Image.Width, GifFileIn->Image.Height, + InterlacedFlag, + GifFileIn->Image.ColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Load the image (either Interlaced or not), and dump it as */ + /* defined in GifFileOut->Image.Interlaced. */ + if (LoadImage(GifFileIn, &ImageBuffer) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (DumpImage(GifFileOut, ImageBuffer) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, so discard: */ + while (Extension != NULL) { + if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + } + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + if ((GifFileIn = DGifOpenFileName(TempGifName)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + + + /* Scan the content of GIF file and dump image(s) to seperate file(s): */ + do { + sprintf(CrntFileName, "%s%02d.gif", OutFileName, FileNum++); + if ((GifFileOut = EGifOpenFileName(CrntFileName, TRUE)) == NULL) + QuitGifError(GifFileIn, GifFileOut); + FileEmpty = TRUE; + + /* And dump out its exactly same screen information: */ + if (EGifPutScreenDesc(GifFileOut, + GifFileIn->SWidth, GifFileIn->SHeight, + GifFileIn->SColorResolution, GifFileIn->SBackGroundColor, + GifFileIn->SColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + do { + if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + FileEmpty = FALSE; + if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + /* Put same image descriptor to out file: */ + if (EGifPutImageDesc(GifFileOut, + GifFileIn->Image.Left, GifFileIn->Image.Top, + GifFileIn->Image.Width, GifFileIn->Image.Height, + GifFileIn->Image.Interlace, + GifFileIn->Image.ColorMap) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* Now read image itself in decoded form as we dont */ + /* really care what is there, and this is much faster. */ + if (DGifGetCode(GifFileIn, &CodeSize, &CodeBlock) == GIF_ERROR + || EGifPutCode(GifFileOut, CodeSize, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + while (CodeBlock != NULL) + if (DGifGetCodeNext(GifFileIn, &CodeBlock) == GIF_ERROR || + EGifPutCodeNext(GifFileOut, CodeBlock) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case EXTENSION_RECORD_TYPE: + FileEmpty = FALSE; + /* Skip any extension blocks in file: */ + if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (EGifPutExtension(GifFileOut, ExtCode, Extension[0], + Extension) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + + /* No support to more than one extension blocks, discard.*/ + while (Extension != NULL) + if (DGifGetExtensionNext(GifFileIn, &Extension) + == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + break; + case TERMINATE_RECORD_TYPE: + break; + default: /* Should be traps by DGifGetRecordType. */ + break; + } + } + while (RecordType != IMAGE_DESC_RECORD_TYPE && + RecordType != TERMINATE_RECORD_TYPE); + + if (EGifCloseFile(GifFileOut) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + if (FileEmpty) { + /* Might happen on last file - delete it if so: */ + unlink(CrntFileName); + } + } + while (RecordType != TERMINATE_RECORD_TYPE); + + if (DGifCloseFile(GifFileIn) == GIF_ERROR) + QuitGifError(GifFileIn, GifFileOut); + FileNum=FileNum-1; + } +return FileNum; +} + +/****************************************************************************** +* Close both input and output file (if open), and exit. * +******************************************************************************/ +void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut) +{ + PrintGifError(); + if (GifFileIn != NULL) DGifCloseFile(GifFileIn); + if (GifFileOut != NULL) EGifCloseFile(GifFileOut); +// exit(EXIT_FAILURE); +} + + +int LoadImage(GifFileType *GifFile, GifRowType **ImageBufferPtr) +{ + int Size, i, j, Count; + GifRowType *ImageBuffer; + + /* Allocate the image as vector of column of rows. We cannt allocate */ + /* the all screen at once, as this broken minded CPU can allocate up to */ + /* 64k at a time and our image can be bigger than that: */ + if ((ImageBuffer = (GifRowType *) + malloc(GifFile->Image.Height * sizeof(GifRowType *))) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + + Size = GifFile->Image.Width * sizeof(GifPixelType);/* One row size in bytes.*/ + for (i = 0; i < GifFile->Image.Height; i++) { + /* Allocate the rows: */ + if ((ImageBuffer[i] = (GifRowType) malloc(Size)) == NULL) + GIF_EXIT("Failed to allocate memory required, aborted."); + } + + *ImageBufferPtr = ImageBuffer; + + GifQprintf("\n%s: Image %d at (%d, %d) [%dx%d]: ", + PROGRAM_NAME, ++ImageNum, GifFile->Image.Left, GifFile->Image.Top, + GifFile->Image.Width, GifFile->Image.Height); + if (GifFile->Image.Interlace) { + /* Need to perform 4 passes on the images: */ + for (Count = i = 0; i < 4; i++) + for (j = InterlacedOffset[i]; j < GifFile->Image.Height; + j += InterlacedJumps[i]) { +// GifQprintf("\b\b\b\b%-4d", Count++); + if (DGifGetLine(GifFile, ImageBuffer[j], GifFile->Image.Width) + == GIF_ERROR) return GIF_ERROR; + } + } + else { + for (i = 0; i < GifFile->Image.Height; i++) { +// GifQprintf("\b\b\b\b%-4d", i); + if (DGifGetLine(GifFile, ImageBuffer[i], GifFile->Image.Width) + == GIF_ERROR) return GIF_ERROR; + } + } + + return GIF_OK; +} + +/****************************************************************************** +* Routine to dump image out. The given Image buffer should always hold the * +* image sequencially. Image will be dumped according to IInterlaced flag in * +* GifFile structure. Once dumped, the memory holding the image is freed. * +* Return GIF_OK if succesful, GIF_ERROR otherwise. * +******************************************************************************/ +int DumpImage(GifFileType *GifFile, GifRowType *ImageBuffer) +{ + int i, j, Count; + + if (GifFile->Image.Interlace) { + /* Need to perform 4 passes on the images: */ + for (Count = GifFile->Image.Height, i = 0; i < 4; i++) + for (j = InterlacedOffset[i]; j < GifFile->Image.Height; + j += InterlacedJumps[i]) { +// GifQprintf("\b\b\b\b%-4d", Count--); + if (EGifPutLine(GifFile, ImageBuffer[j], GifFile->Image.Width) + == GIF_ERROR) return GIF_ERROR; + } + } + else { + for (Count = GifFile->Image.Height, i = 0; i < GifFile->Image.Height; i++) { +// GifQprintf("\b\b\b\b%-4d", Count--); + if (EGifPutLine(GifFile, ImageBuffer[i], GifFile->Image.Width) + == GIF_ERROR) return GIF_ERROR; + } + } + + /* Free the m emory used for this image: */ + for (i = 0; i < GifFile->Image.Height; i++) free((char *) ImageBuffer[i]); + free((char *) ImageBuffer); + + return GIF_OK; +} diff --git a/gifdecomp.h b/gifdecomp.h new file mode 100644 index 0000000..edc4262 --- /dev/null +++ b/gifdecomp.h @@ -0,0 +1,31 @@ +/* + * $Id: gifdecomp.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include "gif_lib.h" + +#ifndef __GIFDECOMP_H__ + +#define __GIFDECOMP_H__ + +int gifdecomp(char *InFileName, char *OutFileName); +void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut); + +#endif diff --git a/globals.h b/globals.h new file mode 100644 index 0000000..6e18b35 --- /dev/null +++ b/globals.h @@ -0,0 +1,138 @@ +#ifndef __GLOBALS_H__ +#define __GLOBALS_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HAVE_DREAMBOX_HARDWARE +#include +#endif +#include +#include +#include +#include +#include +#include FT_FREETYPE_H +#include FT_CACHE_H +#include FT_CACHE_SMALL_BITMAPS_H +#include "text.h" +#include "io.h" +#include "gfx.h" + +#define P_VERSION "1.36" +#define MAX_ENTRYS 32 +#define CK_INTERVALL 30 +#define STATFILE "/var/etc/logcsd.stat" +#define SCKFILE "/tmp/logcsd.socket" +#define PIDFILE "/tmp/logcsd.pid" +#define ECMFILE "/tmp/ecm.info" + +#define RC_0 0x00 +#define RC_1 0x01 +#define RC_2 0x02 +#define RC_3 0x03 +#define RC_4 0x04 +#define RC_5 0x05 +#define RC_6 0x06 +#define RC_7 0x07 +#define RC_8 0x08 +#define RC_9 0x09 +#define RC_RIGHT 0x0A +#define RC_LEFT 0x0B +#define RC_UP 0x0C +#define RC_DOWN 0x0D +#define RC_OK 0x0E +#define RC_MUTE 0x0F +#define RC_STANDBY 0x10 +#define RC_GREEN 0x11 +#define RC_YELLOW 0x12 +#define RC_RED 0x13 +#define RC_BLUE 0x14 +#define RC_PLUS 0x15 +#define RC_MINUS 0x16 +#define RC_HELP 0x17 +#define RC_DBOX 0x18 +#define RC_HOME 0x1F + +FILE *fd_pid; +int pid; + +typedef struct {unsigned char used; + unsigned char user[32]; + unsigned char pwd[32]; + unsigned char ip[16]; + int newip; + int connection; + int cmd; + char prov[12]; + char serv[5]; + int cok; + int active; + time_t ltime; + time_t atime; + time_t stime; + time_t ctime; + double rtime; + } ENTRY, *PENTRY; + +typedef struct {ENTRY entrys[MAX_ENTRYS]; + } LOG; + +extern unsigned char FONT[64]; +extern char camdversion[16]; +extern char dversion[16]; + +enum {LEFT, CENTER, RIGHT}; +enum {SMALL, MED, BIG}; + +FT_Error error; +FT_Library library; +FTC_Manager manager; +FTC_SBitCache cache; +FTC_SBit sbit; +#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 +FTC_Image_Desc desc; +#else +FTC_ImageTypeRec desc; +#endif +FT_Face face; +FT_UInt prev_glyphindex; +FT_Bool use_kerning; + +//devs + +int fb, rc; + +//framebuffer stuff + +enum {FILL, GRID}; +enum {EMPTY, CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, TRANSP, BLUE2, ORANGE, GREEN, YELLOW, RED}; + +extern unsigned char *lfb, *lbb; +extern unsigned char *proxyadress, *proxyuserpwd; + +struct fb_fix_screeninfo fix_screeninfo; +struct fb_var_screeninfo var_screeninfo; + +//int startx, starty, sx, ex, sy, ey; + +#define FB_DEVICE "/dev/fb/0" + +#define MAXSLOTS 4 + +#endif diff --git a/http.c b/http.c new file mode 100644 index 0000000..32197fc --- /dev/null +++ b/http.c @@ -0,0 +1,169 @@ +/* + * http.c - TuxBox Weather Plugin / HTTP-Interface + * + * Copyright (C) 2004 SnowHead + * Worschter + * + * 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. + * + * $Id: http.c,v 1.01 2004/09/30 00:29 SnowHead $ + */ + +#include +//#include /* new for v7 */ +#include /* new for v7 */ +#include +//#include "lcd.h" +#include "tuxwetter.h" + + +double spdsize[3]={100000.0,16000.0,8000.0}; +int speed=0; + +int show_progress( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow ) +{ +#if 0 + char prstr[50]; + + if(dltotal +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "io.h" +#include "tuxwetter.h" +#define RC_DEVICE "/dev/input/nevis_ir" + +extern int instance; +struct input_event ev; +static unsigned short rccode=-1; +static int rc; + +int InitRC(void) +{ + rc = open(RC_DEVICE, O_RDONLY); + if(rc == -1) + { + perror("msgbox "); + exit(1); + } + fcntl(rc, F_SETFL, O_NONBLOCK | O_SYNC); + while(RCKeyPressed()); + return 1; +} + +int CloseRC(void) +{ + while(RCKeyPressed()); + close(rc); + return 1; +} + +int RCKeyPressed(void) +{ + if(read(rc, &ev, sizeof(ev)) == sizeof(ev)) + { + if(ev.value) + { + rccode=ev.code; + return 1; + } + } + rccode = -1; + return 0; +} + + +int GetRCCode(void) +{ + int rv; + + if(!RCKeyPressed() || (get_instance()>instance)) + { + return -1; + } + rv=rccode; + while(RCKeyPressed()); + + return rv; +} + + diff --git a/io.h b/io.h new file mode 100644 index 0000000..1619ae7 --- /dev/null +++ b/io.h @@ -0,0 +1,12 @@ +#ifndef __IO_H__ + +#define __IO_H__ + +#define RC_DEVICE "/dev/input/nevis_ir" + +int InitRC(void); +int CloseRC(void); +int RCKeyPressed(void); +int GetRCCode(void); + +#endif diff --git a/jpeg.c b/jpeg.c new file mode 100644 index 0000000..8d32e75 --- /dev/null +++ b/jpeg.c @@ -0,0 +1,184 @@ +/* + * $Id: jpeg.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FH_ERROR_OK 0 +#define FH_ERROR_FILE 1 /* read/access error */ +#define FH_ERROR_FORMAT 2 /* file format error */ +#define FH_ERROR_MALLOC 3 /* error during malloc */ + +struct r_jpeg_error_mgr +{ + struct jpeg_error_mgr pub; + jmp_buf envbuffer; +}; + + +int fh_jpeg_id(const char *name) +{ +// dbout("fh_jpeg_id {\n"); + int fd; + unsigned char id[10]; + fd=open(name,O_RDONLY); if(fd==-1) return(0); + read(fd,id,10); + close(fd); +// dbout("fh_jpeg_id }\n"); + if(id[6]=='J' && id[7]=='F' && id[8]=='I' && id[9]=='F') return(1); + if(id[0]==0xff && id[1]==0xd8 && id[2]==0xff) return(1); + return(0); +} + + +void jpeg_cb_error_exit(j_common_ptr cinfo) +{ +// dbout("jpeg_cd_error_exit {\n"); + struct r_jpeg_error_mgr *mptr; + mptr=(struct r_jpeg_error_mgr*) cinfo->err; + (*cinfo->err->output_message) (cinfo); + longjmp(mptr->envbuffer,1); +// dbout("jpeg_cd_error_exit }\n"); +} + +int fh_jpeg_load(const char *filename,unsigned char *buffer,int x,int y) +{ +// dbout("fh_jpeg_load (%d/%d) {\n",x,y); + struct jpeg_decompress_struct cinfo; + struct jpeg_decompress_struct *ciptr; + struct r_jpeg_error_mgr emgr; + unsigned char *bp; + int px,py,c; + FILE *fh; + JSAMPLE *lb; + + ciptr=&cinfo; + if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE); + ciptr->err=jpeg_std_error(&emgr.pub); + emgr.pub.error_exit=jpeg_cb_error_exit; + if(setjmp(emgr.envbuffer)==1) + { + // FATAL ERROR - Free the object and return... + jpeg_destroy_decompress(ciptr); + fclose(fh); +// dbout("fh_jpeg_load } - FATAL ERROR\n"); + return(FH_ERROR_FORMAT); + } + + jpeg_create_decompress(ciptr); + jpeg_stdio_src(ciptr,fh); + jpeg_read_header(ciptr,TRUE); + ciptr->out_color_space=JCS_RGB; + if(x==(int)ciptr->image_width) + ciptr->scale_denom=1; + else if(abs(x*2 - ciptr->image_width) < 2) + ciptr->scale_denom=2; + else if(abs(x*4 - ciptr->image_width) < 4) + ciptr->scale_denom=4; + else if(abs(x*8 - ciptr->image_width) < 8) + ciptr->scale_denom=8; + else + ciptr->scale_denom=1; + + jpeg_start_decompress(ciptr); + + px=ciptr->output_width; py=ciptr->output_height; + c=ciptr->output_components; + + + if(c==3) + { + lb=(JSAMPLE*)(*ciptr->mem->alloc_small)((j_common_ptr) ciptr,JPOOL_PERMANENT,c*px); + bp=buffer; + while(ciptr->output_scanline < ciptr->output_height) + { + jpeg_read_scanlines(ciptr, &lb, 1); + memcpy(bp,lb,px*c); + bp+=px*c; + } + + } + jpeg_finish_decompress(ciptr); + jpeg_destroy_decompress(ciptr); + fclose(fh); +// dbout("fh_jpeg_load }\n"); + return(FH_ERROR_OK); +} + +int fh_jpeg_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height) +{ +// dbout("fh_jpeg_getsize {\n"); + struct jpeg_decompress_struct cinfo; + struct jpeg_decompress_struct *ciptr; + struct r_jpeg_error_mgr emgr; + + int px,py,c; + FILE *fh; + + ciptr=&cinfo; + if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE); + + ciptr->err=jpeg_std_error(&emgr.pub); + emgr.pub.error_exit=jpeg_cb_error_exit; + if(setjmp(emgr.envbuffer)==1) + { + // FATAL ERROR - Free the object and return... + jpeg_destroy_decompress(ciptr); + fclose(fh); +// dbout("fh_jpeg_getsize } - FATAL ERROR\n"); + return(FH_ERROR_FORMAT); + } + + jpeg_create_decompress(ciptr); + jpeg_stdio_src(ciptr,fh); + jpeg_read_header(ciptr,TRUE); + ciptr->out_color_space=JCS_RGB; + // should be more flexible... + if((int)ciptr->image_width/8 >= wanted_width || + (int)ciptr->image_height/8 >= wanted_height) + ciptr->scale_denom=8; + else if((int)ciptr->image_width/4 >= wanted_width || + (int)ciptr->image_height/4 >= wanted_height) + ciptr->scale_denom=4; + else if((int)ciptr->image_width/2 >= wanted_width || + (int)ciptr->image_height/2 >= wanted_height) + ciptr->scale_denom=2; + else + ciptr->scale_denom=1; + + jpeg_start_decompress(ciptr); + px=ciptr->output_width; py=ciptr->output_height; + c=ciptr->output_components; + *x=px; *y=py; +// jpeg_finish_decompress(ciptr); + jpeg_destroy_decompress(ciptr); + fclose(fh); +// dbout("fh_jpeg_getsize }\n"); + return(FH_ERROR_OK); +} + diff --git a/jpeg.h b/jpeg.h new file mode 100644 index 0000000..f207a4c --- /dev/null +++ b/jpeg.h @@ -0,0 +1,28 @@ +/* + * $Id: jpeg.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#ifndef __JPG_H__ +#define __JPG_H__ + +int fh_jpeg_load(const char *filename,unsigned char *buffer,int x,int y); +int fh_jpeg_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height); + +#endif diff --git a/parser.c b/parser.c new file mode 100644 index 0000000..cb9b938 --- /dev/null +++ b/parser.c @@ -0,0 +1,570 @@ +/* +********************************************************************************************* +********************************** New Tuxwetter XML-File_parser **************************** +********************************************************************************************* +*/ +//getline needed #define _GNU_SOURCE +#define _GNU_SOURCE +#include + +#include +#include +#include "tuxwetter.h" +#include "parser.h" +#include "http.h" + +/* +Interne Variablen Bitte nicht direkt aufrufen!!! +*/ +#ifdef WWEATHER +# define MAXITEM 200 +# define MAXMEM 300 +#else +# define MAXITEM 1000 +# define MAXMEM 50 +#endif +char data [MAXITEM][MAXMEM]; +char conveng [500][40]; +char convger [500][40]; +int prev_count = 0; +char null[2]= {0,0}; +int ptc= 0; +int t_actday= 0; +int t_actmonth= 0; +int t_actyear= 0; +const char mnames[12][10]={"Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"}; +char prstrans[512]; + +//**************************************** Preview Counter ******************************** + +extern char CONVERT_LIST[]; +extern void TrimString(char *strg); + +void prs_check_missing(char *entry) +{ +char rstr[512]; +int found=0; +FILE *fh; + + if((fh=fopen(MISS_FILE,"r"))!=NULL) + { + while(!feof(fh)&&!found) + { + if(fgets(rstr,500,fh)) + { + TrimString(rstr); + if(!strcmp(rstr,entry)) + { + found=1; + } + } + } + fclose(fh); + } + if(!found) + { + if((fh=fopen(MISS_FILE,"a"))!=NULL) + { + fprintf(fh,"%s\n",entry); + fclose(fh); + } + } +} + +char *prs_translate(char *trans, char *tfile) +{ +char *sptr; +int i,found=0; +FILE *fh; + + if((fh=fopen(tfile,"r"))!=NULL) + { + while(!found && fgets(prstrans,511,fh)) + { + TrimString(prstrans); + if(strstr(prstrans,trans)==prstrans) + { + sptr=prstrans+strlen(trans); + if(*sptr=='|') + { + ++sptr; + i=strlen(sptr); + memmove(prstrans,sptr,i+1); + found=1; + } + } + } + fclose(fh); + } + if(found && strlen(prstrans)) + { + if(!strcmp(prstrans,"---")) + { + *prstrans=0; + } + return prstrans; + } + return trans; +} + +int prs_get_prev_count (void) +{ + return prev_count; +} + +int prs_get_day (int i, char *out, int metric) +{ + int ret=1, set=(PRE_DAY+(i*PRE_STEP)), z=0, intdaynum=0, monthtemp=0; + char day[15], tstr[128]; + char *pt1, *pt2; + + *out=0; + if((pt1=strstr(data[set],"T=\""))!=NULL) + { + pt1+=3; + if((pt2=strstr(pt1,"\""))!=NULL) + { + strncpy(day,pt1,pt2-pt1); + day[pt2-pt1]=0; + + for(z=0;z<=ptc;z++) + { + if (strcasecmp(day,conveng[z])==0) strcpy (day,convger[z]); + } + + pt2++; + if((pt1=strstr(pt2,"DT=\""))!=NULL) + { + pt1+=4; + if((pt2=strstr(pt1," "))!=NULL) + { + pt2++; + if(sscanf(pt2,"%d",&intdaynum)==1) + { + monthtemp=t_actmonth; + if (intdaynum < t_actday) + { + if((++monthtemp)>12) + { + monthtemp =1; + } + } + sprintf(tstr,"%s",prs_translate((char*)day,CONVERT_LIST)); + if(metric) + { + sprintf (out,"%s, %02d. %s", tstr, intdaynum, prs_translate((char*)mnames[monthtemp-1],CONVERT_LIST)); + } + else + { + sprintf (out,"%s, %s %02d. ", tstr, prs_translate((char*)mnames[monthtemp-1],CONVERT_LIST),intdaynum); + } + ret=0; + } + } + } + } + } +return ret; +} + +int prs_get_val (int i, int what, int nacht, char *out) +{ +int z; + + strcpy(out,data[(what & ~TRANSLATION)+(i*PRE_STEP)+(nacht*NIGHT_STEP)]); + if(what & TRANSLATION) + { + for(z=0;z<=ptc;z++) + { + if (strcasecmp(out,conveng[z])==0) + { + strcpy (out,convger[z]); + return 0; + } + } + if(sscanf(out,"%d",&z)!=1) + { + prs_check_missing(out); + } + } + return (strlen(out)==0); +} + +int prs_get_dbl (int i, int what, int nacht, char *out) +{ +int ret=1; +double tv; + + *out=0; + if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)+(nacht*NIGHT_STEP)], "%lf", &tv)==1) + { + sprintf(out, "%05.2lf", tv); + ret=0; + } + return ret; +} + +int prs_get_time(int i, int what, char *out, int metric) +{ +int hh,mm,ret=1; + + *out=0; + if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d:%d",&hh,&mm)==2) + { + if(metric) + { + if(hh<12) + { + if(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL) + { + hh+=12; + } + } + else + { + if(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"AM")!=NULL) + { + hh=0; + } + } + sprintf(out,"%02d:%02d",hh,mm); + } + else + { + sprintf(out,"%02d:%02d %s",hh,mm,(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)?"PM":"AM"); + } + ret=0; + } + return ret; +} + +int prs_get_dtime(int i, int what, char *out, int metric) +{ +int hh,mm,ret=1; + + *out=0; + if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d/%d/%d %d:%d",&t_actmonth,&t_actday,&t_actyear,&hh,&mm)==5) + { + if(metric) + { + if((hh<12)&&(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)) + { + hh+=12; + } + sprintf(out,"%02d.%02d.%04d %02d:%02d",t_actday,t_actmonth,t_actyear+2000,hh,mm); + } + else + { + sprintf(out,"%04d/%02d/%02d %02d:%02d %s",t_actyear+2000,t_actmonth,t_actday,hh,mm,(strstr(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"PM")!=NULL)?"PM":"AM"); + } + ret=0; + } + return ret; +} + +int prs_get_dwday(int i, int what, char *out) +{ + int ret=1; + char *wday[] = {"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","???"}; + + struct tm ts; + + *out=0; + + if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d-%d-%d",&t_actyear,&t_actmonth,&t_actday)==3) + { + ts.tm_year = t_actyear - 1900; + ts.tm_mon = t_actmonth - 1; + ts.tm_mday = t_actday; + + ts.tm_hour = 0; + ts.tm_min = 0; + ts.tm_sec = 1; + ts.tm_isdst = -1; + + if ( mktime(&ts) == -1 ) + ts.tm_wday = 7; + + sprintf(out,"%s", wday[ts.tm_wday]); + ret=0; + } + return ret; +} + +//**************************************** Parser **************************************** + +//*** XML File *** + +int parser(char *citycode, char *trans, int metric, int inet, int ctmo) +{ + int rec=0, flag=0; + int cc=0, bc=1, exit_ind=-1; + char gettemp; + FILE *wxfile=NULL; + char url[250]; + char debug[505]; + +#ifdef WWEATHER + extern char key[]; + int d_flag=0; //data flag ">DATA<" + int D_flag=0; //data flag "[DATA]" + int l_flag=0; //do not change to upper case (URL) +#else + int day_data=PRE_DAY; + int previews=9; + extern char par[], key[]; +#endif + memset(data,0,MAXITEM*MAXMEM /* 1000*50 */); + memset(conveng,0,500*40); + memset(convger,0,500*40); + prev_count=0; + memset(null,0,2); + ptc=0; + t_actday=0; + t_actmonth=0; + +#ifdef WWEATHER +/* sprintf (url,"wget -q -O /tmp/tuxwettr.tmp \"http://free.worldweatheronline.com/feed/weather.ashx?q=%s&format=xml&num_of_days=5&includeLocation=yes&key=%s\"",citycode,key); + exit_ind=system(url); + sleep(1); +*/ + sprintf (url,"http://free.worldweatheronline.com/feed/weather.ashx?q=%s&format=xml&num_of_days=5&includeLocation=yes&key=%s",citycode,key); + exit_ind=HTTP_downloadFile(url, "/tmp/tuxwettr.tmp", 0, inet, ctmo, 3); + + if(exit_ind != 0) + { + printf("Tuxwetter \n",exit_ind); + exit_ind=-1; + return exit_ind; + } + + exit_ind=-1; + + if ((wxfile = fopen("/tmp/tuxwettr.tmp","r"))==NULL) + { + printf("Tuxwetter \n"); + return exit_ind; + } + else + { + fgets(debug,50,wxfile); + //printf("%s\n",debug); + if((debug[45] != 'r')||(debug[46] != 'e')||(debug[47] != 'q')) + { + fclose(wxfile); + return exit_ind; + } + else + { + // starting position forcast + bc = NA; + strcpy(data[bc],"N/A"); + bc++; + + fseek(wxfile, 0L, SEEK_SET); + while (!feof(wxfile)) + { + gettemp=fgetc(wxfile); + if (gettemp == '<' || gettemp == ']') rec = 0; + if (gettemp == ':') l_flag = 1; + if (rec == 1) + { + if(!l_flag) + data[bc][cc] = toupper(gettemp); + else + data[bc][cc] = gettemp; + cc++; + d_flag=1; + if(cc == MAXMEM-1) rec = 0; + } + if (gettemp == '>' || gettemp == '[') rec = 1; + if (gettemp == '[' && !D_flag) + { + rec = 0; + D_flag = 1; + } + if ((gettemp == '<' || gettemp == ']') && d_flag) + { + data[bc][cc] = '\0'; + bc++; + cc = 0; + rec = 0; + d_flag = 0; + D_flag = 0; + l_flag = 0; + } + } + } + } + fclose(wxfile); + cc=0; + + exit_ind=1; +#else + sprintf (url,"wget -q -O /tmp/tuxwettr.tmp http://xoap.weather.com/weather/local/%s?unit=%c\\&dayf=%d\\&cc=*\\&prod=xoap\\&link=xoap\\&par=%s\\&key=%s",citycode,(metric)?'m':'u',previews,par,key); + exit_ind=system(url); + + sleep(1); + if(exit_ind != 0) + { + printf("Tuxwetter \n",exit_ind); + exit_ind=-1; + return exit_ind; + } + exit_ind=-1; + system("sed -i /'prmo'/,/'\\/lnks'/d /tmp/tuxwettr.tmp"); + if ((wxfile = fopen("/tmp/tuxwettr.tmp","r"))==NULL) + { + printf("Tuxwetter \n"); + return exit_ind; + } + else + { + bc=1; + fgets(debug,500,wxfile); +// printf("%s",debug); + fgets(debug,5,wxfile); +// printf("%s",debug); + if((debug[0] != 60)||(debug[1] != 33)||(debug[2] != 45)||(debug[3] != 45)) + { + fclose(wxfile); + return exit_ind; + } + else { + fclose(wxfile); + wxfile = fopen("/tmp/tuxwettr.tmp","r"); + while (!feof(wxfile)) + { + gettemp=fgetc(wxfile); + if ((gettemp >=97) && (gettemp <=122)) gettemp = gettemp -32; + if (gettemp == 13) gettemp=0; + if (bc == day_data) + { + + if (gettemp == 62) + { + rec = 0; + } + if (rec == 1) + { + data[bc][cc] = gettemp; + cc++; + } + if (gettemp == 60) rec = 1; + if (gettemp == 13) data[bc][cc+1] =0; + if (gettemp == 10) + { + bc++; + cc = 0; + int prs_get_dwday(int i, int what, char *out) +{ + int ret=1; + char *wday[] = {"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY","???"}; + + struct tm ts; + + *out=0; + + if(sscanf(data[(what & ~TRANSLATION)+(i*PRE_STEP)],"%d-%d-%d",&t_actyear,&t_actmonth,&t_actday)==3) + { + ts.tm_year = t_actyear - 1900; + ts.tm_mon = t_actmonth - 1; + ts.tm_mday = t_actday; + + ts.tm_hour = 0; + ts.tm_min = 0; + ts.tm_sec = 1; + ts.tm_isdst = -1; + + if ( mktime(&ts) == -1 ) + ts.tm_wday = 7; + + sprintf(out,"%s", wday[ts.tm_wday]); + ret=0; + } + return ret; +} rec = 0; + flag=1; + prev_count++; + } + } + else + { + if (gettemp == 60) rec = 0; + if (rec == 1) + { + data[bc][cc] = gettemp; + cc++; + } + if (gettemp == 62) rec = 1; + if (gettemp == 13) data[bc][cc] =0; + if (gettemp == 10) + { + bc++; + cc = 0; + rec = 0; + } + } + if ((flag==1) && (gettemp == 0)) + { + day_data=day_data+PRE_STEP; + flag=0; + } + } + } + fclose(wxfile); + } + if (prev_count > 0) prev_count=prev_count-1; + if (prev_count > 0) prev_count=prev_count-1; + cc=0; + + exit_ind=1; +#endif +//*** Übersetzungs File *** + + if ((wxfile = fopen(trans,"r"))==NULL) + { + printf("Tuxwetter \n",trans); + return exit_ind; + } + else + { + while (!feof(wxfile)) + { + gettemp=fgetc(wxfile); + if (gettemp == 10) + { + cc=0; + ptc++; + flag=0; + } + else + { + if (gettemp == 124) + { + cc=0; + flag=2; + } + if (gettemp == 13) gettemp = 0; + if (flag==0) + { + if ((gettemp >=97) && (gettemp <=122)) gettemp = gettemp -32; + conveng[ptc][cc]=gettemp; + } + if (flag==1) convger[ptc][cc]=gettemp; + cc++; + if (flag == 2) + { + flag--; + cc=0; + } + } + } + fclose(wxfile); + } + prs_get_dtime (0, ACT_UPTIME, debug, metric); + +return 0; +} + + diff --git a/parser.h b/parser.h new file mode 100644 index 0000000..64a1753 --- /dev/null +++ b/parser.h @@ -0,0 +1,116 @@ + +#include +#include +#include + + +#ifndef __wxparser__ +#define __wxparser__ + +#define TRANSLATION 0x8000 + +#ifdef WWEATHER +# define NA 0 +# define PRE_STEP 14 +# define NIGHT_STEP 13 + + // atual Values +# define ACT_CITY 2 +# define ACT_OBST 3 +# define ACT_LAT 6 +# define ACT_LON 7 +# define ACT_UPTIME 10 +# define ACT_TEMP 11 +# define ACT_ICON 14 +# define ACT_COND 15 | TRANSLATION +# define ACT_WSPEED 17 +# define ACT_WINDD 19 | TRANSLATION +# define ACT_PRECIPMM 20 +# define ACT_HMID 21 +# define ACT_VIS 22 +# define ACT_PRESS 23 +# define ACT_CLOUDC 24 +# define ACT_SUNR NA +# define ACT_SUNS NA +# define ACT_FTEMP NA +# define ACT_PRTEND NA +# define ACT_UVIND NA +# define ACT_UVTEXT NA +# define ACT_DEWP NA +# define ACT_MOON NA + + // Preview Values +# define PRE_DAY 25 +# define PRE_TEMPH 26 +# define PRE_TEMPL 28 +# define PRE_WSPEED 31 +# define PRE_WINDD 32 | TRANSLATION +# define PRE_ICON 36 +# define PRE_COND 37 | TRANSLATION +# define PRE_PRECIPMM 38 +# define PRE_SUNR NA +# define PRE_SUNS NA +# define PRE_BT NA +# define PRE_PPCP NA +# define PRE_HMID NA +#else +# define PRE_STEP 32 +# define NIGHT_STEP 13 + + // atual Values +# define ACT_CITY 16 +# define ACT_TIME 17 +# define ACT_LAT 18 +# define ACT_LON 12 +# define ACT_SUNR 4 +# define ACT_SUNS 21 +# define ACT_UPTIME 25 +# define ACT_OBST 26 +# define ACT_TEMP 27 +# define ACT_FTEMP 28 +# define ACT_COND 29 | TRANSLATION +# define ACT_ICON 30 +# define ACT_PRESS 32 +# define ACT_PRTEND 33 | TRANSLATION +# define ACT_WSPEED 36 +# define ACT_WINDD 39 | TRANSLATION +# define ACT_HMID 41 +# define ACT_VIS 42 | TRANSLATION +# define ACT_UVIND 44 +# define ACT_UVTEXT 45 | TRANSLATION +# define ACT_DEWP 47 +# define ACT_MOON 50 | TRANSLATION + + // Preview Values +# define PRE_DAY 55 +# define PRE_TEMPH 56 +# define PRE_TEMPL 57 +# define PRE_SUNR 58 +# define PRE_SUNS 59 +# define PRE_ICON 61 +# define PRE_COND 62 | TRANSLATION +# define PRE_WSPEED 64 +# define PRE_WINDD 67 | TRANSLATION +# define PRE_BT 69 +# define PRE_PPCP 70 +# define PRE_HMID 71 +#endif + +int parser (char *,char *, int, int, int); +int prs_get_prev_count (void); +/*void prs_get_act_int (int what, char *out); +void prs_get_act_loc (int what, char *out); +void prs_get_act_dbl (int what, char *out); +void prs_get_act_time(int what, char *out); +void prs_get_act_dtime(int what, char *out); +*/ +int prs_get_day (int, char *, int); +int prs_get_val (int i, int what, int nacht, char *out); +int prs_get_dbl (int i, int what, int nacht, char *out); +int prs_get_time(int i, int what, char *out, int metric); +int prs_get_dtime(int i, int what, char *out, int metric); +int prs_get_dwday(int i, int what, char *out); +char *prs_translate(char *trans, char *tfile); + +#endif // __wxparser__ + diff --git a/php.c b/php.c new file mode 100644 index 0000000..a5649f4 --- /dev/null +++ b/php.c @@ -0,0 +1,173 @@ +#include +#include +#include +#include +#include "text.h" +#include "tuxwetter.h" + +#define FH_ERROR_OK 0 +#define FH_ERROR_FILE 1 /* read/access error */ +#define FH_ERROR_FORMAT 2 /* file format error */ +#define FH_ERROR_MALLOC 3 /* error during malloc */ + +int fh_php_trans(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int *cut, int *x, int *y, int plain, int plot) +{ +char tstr[BUFSIZE],rstr[BUFSIZE],*tptr,*xptr,cc,br3flag=0; +int loop=1, j, first, aline=0, fx=sx, fy=sy, slen, deg=0; +FILE *fh; + + if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); + + first=(line==0); + *x=0; + *y=0; + sy+=dy; + while((loop>0) && (fgets(tstr, sizeof(tstr), fh))) + { + tptr=tstr+strlen(tstr); + while((tptr>=tstr) && (*tptr<=32)) + { + *tptr=0; + --tptr; + } + + if(((tptr=strstr(tstr,"
"))!=NULL) || ((tptr=strstr(tstr,"

"))!=NULL)) + { + tptr+=4; + if((xptr=strstr(tstr,"

"))!=NULL) + { + *xptr=0; + br3flag=1; + } + if((*tptr=='=') || (strncmp(tptr,"
",4)==0)) + { + if(aline>=line) + { + first=1; + } + } + else + { + if(aline++>=line) + { + j=0; + while(*tptr) + { + if(plain || (*tptr != '&')) + { + rstr[j++]=*tptr; + tptr++; + } + else + { + if((*(tptr+1)!='#') && (strstr(tptr,"uml;")!=(tptr+2)) && (strstr(tptr,"nbsp;")!=(tptr+1)) && (strstr(tptr,"gt;")!=(tptr+1)) && (strstr(tptr,"lt;")!=(tptr+1)) && (strstr(tptr,"quot;")!=(tptr+1)) && (strstr(tptr,"zlig;")!=(tptr+2))) + { + rstr[j++]=*tptr++; + } + else + { + tptr++; + cc=' '; + switch (*tptr) + { + case 'a': cc='ä'; break; + case 'A': cc='Ä'; break; + case 'o': cc='ö'; break; + case 'O': cc='Ö'; break; + case 'u': cc='ü'; break; + case 'U': cc='Ü'; break; + case 's': cc='ß'; break; + case 'q': + case 'Q': cc='"'; break; + case 'l': + case 'g': cc=0; break; + case '#': + if(sscanf(tptr+1,"%3d",°)==1) + { + cc=deg; + } + break; + } + if(cc) + { + rstr[j++]=cc; + } + if((tptr=strchr(tptr,';'))==NULL) + { + printf("Tuxwetter \n"); + fclose(fh); + return -1; + } + else + { + ++tptr; + } + } + } + } + if((loop>0) && (sy<(fy+420))) + { + rstr[j]=0; + if(plot) + { + if(!br3flag) + { + RenderString(rstr, sx, sy, 619, LEFT, cs, (first && highlite)?GREEN:CMCT); + } + else + { + RenderString(rstr, sx, fx+250, 619, CENTER, FSIZE_BIG, CMCT); + } + if(strlen(rstr)) + { + first=0; + } + sy+=dy; + } + else + { + if(strlen(rstr)) + { + slen=GetStringLen(sx, rstr, FSIZE_MED); + if(slen>*x) + { + *x=slen; + } + } + *y=*y+1; + } + } + } + if(plot) + { + *cut=(sy>=(fy+420)); + if(line) + { + RenderString("<<", fx, fy, sx, LEFT, FSIZE_MED, CMHT); + } + if(*cut) + { + RenderString(">>", fx, sy, sx, LEFT, FSIZE_MED, CMHT); + } + } + } + } + } + fclose(fh); + return(FH_ERROR_OK); +} + +int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut) +{ + int dummy; + + return fh_php_trans(name, sx, sy, dy, cs, line, highlite, cut, &dummy, &dummy, plain, 1); +} + + +int fh_php_getsize(const char *name, int plain, int *x, int *y) +{ + int dummy; + + return fh_php_trans(name, 0, 0, 0, 0, 0, 0, &dummy, x, y, plain, 0); +} diff --git a/php.h b/php.h new file mode 100644 index 0000000..a5e0030 --- /dev/null +++ b/php.h @@ -0,0 +1,7 @@ +#ifndef __PHP_H__ +#define __PHP_H__ + +int fh_php_load(const char *name, int sx, int sy, int dy, int cs, int line, int highlite, int plain, int *cut); +int fh_php_getsize(const char *filename, int plain, int *x,int *y); + +#endif diff --git a/plugins.mk.example b/plugins.mk.example new file mode 100644 index 0000000..a0d87a5 --- /dev/null +++ b/plugins.mk.example @@ -0,0 +1,25 @@ +# $(SOURCE) = Path to your tuxwetter sources +# e.g. SOURCE = $(BASE_DIR)/archive-sources + +# Some useful variables +LIBPLUG = $(TARGETPREFIX)/lib/tuxbox/plugins +VARCONF = $(TARGETPREFIX)/var/tuxbox/config +BIN = $(TARGETPREFIX)/bin + +tuxwetter: $(LIBPLUG)/tuxwetter.so $(BIN)/tuxwetter +$(BIN)/tuxwetter: + mkdir -p $(BIN) && \ + mkdir -p $(LIBPLUG)/ && \ + mkdir -p $(VARCONF)/tuxwetter/ && \ + pushd $(SOURCE)/tuxwetter && \ + $(TARGET)-gcc -Wall $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(TARGETPREFIX)/include/freetype2 -lfreetype -lz -DWWEATHER -lcurl -ljpeg -lpng -lungif gifdecomp.c -o $@ tuxwetter.c gfx.c io.c text.c parser.c php.c http.c jpeg.c fb_display.c resize.c pngw.c gif.c && \ + cp -f tuxwetter.cfg $(LIBPLUG)/tuxwetter.cfg && \ + cp -f tuxwetter.conf $(VARCONF)/tuxwetter/ && \ + cp -f tuxwetter.mcfg $(VARCONF)/tuxwetter/ && \ + cp -f startbild.jpg $(VARCONF)/tuxwetter/ && \ + cp -f convert.list $(VARCONF)/tuxwetter/ + +$(LIBPLUG)/tuxwetter.so: + mkdir -p $(LIBPLUG) && \ + pushd $(SOURCE)/tuxwetter && \ + $(TARGET)-gcc $(TARGET_CFLAGS) -L$(TARGETPREFIX)/lib -I$(SOURCE_DIR)/neutrino-hd/src -g -o $@ starter.c diff --git a/pngw.c b/pngw.c new file mode 100644 index 0000000..cd65f64 --- /dev/null +++ b/pngw.c @@ -0,0 +1,176 @@ +/* + * $Id: pngw.c,v 1.2 2011/02/27 14:56:10 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +//#include "config.h" +#include +#include +#include +#include +#include +#include "tuxwetter.h" + +#define FH_ERROR_OK 0 +#define FH_ERROR_FILE 1 /* read/access error */ +#define FH_ERROR_FORMAT 2 /* file format error */ +#define FH_ERROR_MALLOC 3 /* error during malloc */ +#define PNG_BYTES_TO_CHECK 4 +#define min(x,y) ((x) < (y) ? (x) : (y)) + +int fh_png_id(const char *name) +{ + int fd; + char id[4]; + fd=open(name,O_RDONLY); if(fd==-1) return(0); + read(fd,id,4); + close(fd); + if(id[1]=='P' && id[2]=='N' && id[3]=='G') return(1); + return(0); +} + + +int fh_png_load(const char *name,unsigned char *buffer,int x,int y) +{ + static const png_color_16 my_background = {0, 0, 0, 0, 0}; + + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + unsigned int i; + int bit_depth, color_type, interlace_type; + int number_passes,pass; + png_byte * fbptr; + FILE * fh; + + if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); + if(png_ptr == NULL) return(FH_ERROR_FORMAT); + info_ptr = png_create_info_struct(png_ptr); + if(info_ptr == NULL) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + fclose(fh); return(FH_ERROR_FORMAT); + } + +#if (PNG_LIBPNG_VER < 10500) + if(setjmp(png_ptr->jmpbuf)) +#else + if(setjmp(png_jmpbuf(png_ptr))) +#endif + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); return(FH_ERROR_FORMAT); + } + + png_init_io(png_ptr,fh); + + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_set_palette_to_rgb(png_ptr); + png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + /* other possibility for png_set_background: use png_get_bKGD */ + } + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + png_set_gray_to_rgb(png_ptr); + png_set_background(png_ptr, (png_color_16*)&my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + + if (bit_depth < 8) + png_set_packing(png_ptr); + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +/* on Intel PC ?: + if (bit_depth == 16) + png_set_swap(png_ptr); +*/ + + number_passes = png_set_interlace_handling(png_ptr); + png_read_update_info(png_ptr,info_ptr); + + if (width * 3 != png_get_rowbytes(png_ptr, info_ptr)) + { + printf("[png.cpp]: Error processing %s - please report (including image).\n", name); + return(FH_ERROR_FORMAT); + } + + for(pass = 0; pass < number_passes; pass++) + { + fbptr = (png_byte *)buffer; + for (i = 0; i < height; i++, fbptr += width * 3) + { + png_read_row(png_ptr, fbptr, NULL); + } + } + png_read_end(png_ptr, info_ptr); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); + return(FH_ERROR_OK); +} +int fh_png_getsize(const char *name,int *x,int *y, int wanted_width, int wanted_height) +{ + png_structp png_ptr; + png_infop info_ptr; + png_uint_32 width, height; + int bit_depth, color_type, interlace_type; + FILE *fh; + + if(!(fh=fopen(name,"rb"))) return(FH_ERROR_FILE); + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); + if(png_ptr == NULL) return(FH_ERROR_FORMAT); + info_ptr = png_create_info_struct(png_ptr); + if(info_ptr == NULL) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + fclose(fh); return(FH_ERROR_FORMAT); + } + +#if (PNG_LIBPNG_VER < 10500) + if(setjmp(png_ptr->jmpbuf)) +#else + if(setjmp(png_jmpbuf(png_ptr))) +#endif + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + fclose(fh); return(FH_ERROR_FORMAT); + } + + png_init_io(png_ptr,fh); + png_read_info(png_ptr, info_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,&interlace_type, NULL, NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + *x=width; + *y=height; + fclose(fh); + return(FH_ERROR_OK); +} + diff --git a/pngw.h b/pngw.h new file mode 100644 index 0000000..4137d99 --- /dev/null +++ b/pngw.h @@ -0,0 +1,28 @@ +/* + * $Id: pngw.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#ifndef __PNGW_H__ +#define __PNGW_H__ + +int fh_png_load(const char *filename,unsigned char *buffer,int x,int y); +int fh_png_getsize(const char *filename,int *x,int *y, int wanted_width, int wanted_height); + +#endif diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..41cf1aa --- /dev/null +++ b/readme.txt @@ -0,0 +1,475 @@ +#################################################################################### +#### New-Tuxwetter Version 3.54 +#### Aktuelle Wetterinfos und Wettervorhersage +#### Bugreport und Anregungen im Board: +#### http://www.dbox2-tuning.net/forum/viewforum.php?f=27&start=0 +#### Das New-Tuxwetter-Team: SnowHead, Worschter, Seddi, Sanguiniker +#################################################################################### + +ACHTUNG: Bei allen Versionen die älter als die Version 2.30 sind, funktionieren auf- +grund einer Formatumstellung des Wetterservers die Vorschauen nicht mehr!! + +Vorraussetzung: +--------------- + +Die Vorraussetzung für die korrekte Funktion des New-Tuxwetter-Plugins, ist eine +funktionierende Internetverbindung. Diese kann entweder über einen Router oder über +einen PC mit ICS (Internet Connection Sharing = Internetverbindungsfreigabe) erfolgen. +Laufen schon andere Plugins mit Internetanbindung (z.B. Tuxmail, Newsticker etc.), +sollte das Wetterplugin normalerweise ebenfalls funktionieren. +Nutzer eine Proxservers können diesen dem Plugin mit folgenden Einträgen in der Datei +tuxwetter.conf bekanntmachen + + ProxyAdressPort=ProxyAdresse:ProxyPort + ProxyUserPwd=Username:Passwort + + Beispiel: + ProxyAdressPort=192.168.0.128:8080 + ProxyUserPwd=username1:passwort1 + +Die einzigen Einstellungen müssen in der "tuxwetter.conf" vorgenommen werden. + +Mit dem Parameter + + SplashScreen=1 + +legt man fest, daß der Startbildschirm angezeigt werden soll. Mit dem Parameter 0 ent- +fällt der Startbildschirm. Geschlossen wird der Startbildschirm mit der OK-Taste. +Defaulteinstellung ist 1 + + +Mit dem Parameter + + ShowIcons=1 + +kann ausgewählt werden, ob in den Textanzeigen der Wetterdaten zusätzlich die aktuellen +Wettersymbole eingeblendet werden sollen. Da diese Symbole wegen ihrer Größe vom Server +heruntergeladen werden, empfiehlt es sich, bei langsamen Internetverbindungen diese Funk- +tion mit dem Wert 0 zu deaktivieren +Defaulteinstellung ist 0 + +Ob die Einheiten metrisch oder nichtmetrisch angezeigt werden, legt der Parameter + + Metric=1 + +fest. Mit der Defaulteinstellung "1" werden Einheiten, Zeiten und Datum metrisch +dargestellt. + + +Der Parameter + + InetConnection=ISDN + +teilt dem Plugin mit, daß der Internetzugang per ISDN erfolgt. Statt ISDN kann auch ANALOG +eingetragen werden. Für DSL ist kein Eintrag notwendig (default). Anhand dieses Parameters +werden beim Download von Dateien die Timeouts für Verbindungsaufnahme und Gesamtdownload- +Zeit sowie die Dateigröße berechnet, ab welcher der Fortschrittsbalken im LCD angezeigt wird. + +Wer viele Web-Cams auf Home-PC's einbindet, kann mit dem Parameter + + ConnectTimeout=nn + +die Timeoutzeit für eine Verbindungsaufnahme zusätzlich noch einmal spezifizieren, um bei +abgeschalteten PC's nicht zu lange auf eine Fehlermeldung warten zu müssen. nn gibt die +Anzahl in Sekunden an, welche maximal bis zum Etablieren der Verbindung gewartet werden +soll. Da New-Tuxwetter bei nicht erfolgter Verbindung einen zweiten Verbindungsversuch un- +ternimmt, ist die Wartezeit bis zur Fehlermeldung also nn*2 Sekunden. + + +Wer einen eigenen Account bei weather.com hat, kann seine eigenen Zugangsdaten verwenden, +falls der public-Zugang wegen zu häufigem Aufruf mal deaktiviert werden sollte: + +ParterID=dddddddddd +LicenseKey=hhhhhhhhhhhhhhhh + +Registrieren kann man sich hier: http://www.weather.com/services/xmloap.html + +Die bis hier beschriebenen Parameter können auch separat in einer Datei "tuxwetter.mcfg" ge- +halten werden, um eine schnelle Konfiguration durch das Flexible Menü-Plugin "Shellexec" zu +ermöglichen. Existiert eine Datei "/var/plugins/tuxwet/tuxwetter.mcfg", haben die Einträge +in dieser Datei Vorrang vor den Einträgen in der tuxwetter.conf. + + +Nun sind die Städte einzutragen, für welche man die Wetterabfrage auswählen können möchte. +Die Stadtnamen und deren Codes sind in der beiliegenden Datei "Ortscodes.txt" gelistet. + +Der Eintrag für die Städte erfolgt in der Form: + Stadt=Stadtname_für_TV_Anzeige,Stadtcode +z.B.: + Stadt=Mönchengladbach,GMXX0086 + +Wer seine gewünschte Stadt nicht in der Datei findet, kann man im Browser eingeben: +http://xoap.weather.com/search/search?where=StadtName + +Bsp: +http://xoap.weather.com/search/search?where=dresden + +Antwort: + +- +- + Dresden, Germany + Dresden, KS + Dresden, ME + Dresden, NY + Dresden, OH + Dresden, TN + + +Der Stadtcode für Dresden wäre demnach GMXX0025. Wird keine Stadt zurückgegeben, sind für die +angefragte Stadt keine Wetterdaten verfügbar. Dann muß man auf eine Stadt in der Umgebung aus- +weichen. + +Eine weitere Möglichkeit Städtecodes zu finden ist, auf der Seite + +http://de.weather.com/search/search?where=deutschland&what=WeatherCity + +eine der aufgeführten Städte zu wählen (nicht über die Suche!!!) +Die Adressleiste des aufgerufenen Fensters enthält den Stadtcode der benötigt wird. +Es werden nur Städte mit dem Code GMXX0001 bis GMXX0280 unterstützt. +Ist die gewünschte Stadt nicht in dem Bereich, so steht auf der Seite direkt unter +dem Ort die Stadt Wetterstation von der die Daten kommen (z.B. wie Stuttgart). +Dann sucht euch dafür den Stadtcode, denn die Daten sind identisch. + +Der Aufbau der Menüs erfolgt über die Einträge "MENU=" als Anfangskennung und "ENDMENU" als +Endekennung. Diese können beliebig tief verschachtelt und auch mit normalen Einträgen gemischt +werden. Im einfachsten Fall könnte "MENU=New Tuxwetter" am Anfang und "ENDMENU" am Ende der +Liste stehen. Mindestens eine Menüebene ist zwingend notwendig. Innerhalb einer aktuellen Me- +nüseite aufrufbaren Untermenüs sind in der Anzeige durch ein vorangestelltes ">" gekennzeichnet. +Zur optischen Trennung der Einträge kann vor den "Anzeigetext im Menü" ein "*" gesetzt werden. +Unterhalb eines solchen Eintrages wird ein Trennstrich im Menü gezogen. +Um die Darstellung der Namen der Menüeinträge ansprechender gestalten zu können, werden Farb- +steuerzeichen im übergebenen Text unterstützt. Allen Steuerzeichen gemeinsam ist der Beginn +mit dem Zeichen "~". Dieses kommt im normalen Text nicht vor und leitet daher immer einen Farb- +befehl ein. Folgende Farben werden unterstützt: + + ~R nachfolgenden Text rot darstellen, gilt bis zum Textende oder einem neuen Farbbefehl + ~G nachfolgenden Text grün darstellen, gilt bis zum Textende oder einem neuen Farbbefehl + ~B nachfolgenden Text blau darstellen, gilt bis zum Textende oder einem neuen Farbbefehl + ~Y nachfolgenden Text gelb darstellen, gilt bis zum Textende oder einem neuen Farbbefehl + ~S nachfolgenden Text in Standardfarbe darstellen + +Das Menü kann um die Anzeige zusätzlicher, selbst auswählbarer JPG-, PNG- und GIF-Bilder aus +dem Internet erweitert werden. Dazu muß die vollständige URL des anzuzeigenden Bildes bekannt +sein. Um dieses Bild mit in das Funktionsmenü aufzunehmen, ist folgendes in die tuxwetter.conf ein- +zutragen (vor und hinter dem Komma darf kein Leerzeichenstehen!): + + PICTURE=Anzeigetext im Menü,vollständige URL + +Der Text zwischen "=" und "," wird im Funktionsmenü zur Auswahl angezeigt, die URL muß nicht er- +läutert werden. Beispiel: + + PICTURE=Temperaturen aktuell,http://image.de.weather.com/web/maps/de_DE/temperature/current/germany_temp_curr_720_de.jpg + +Ist aus der Bildadresse kein Bildtyp erkennbar, muß dieser zusätzlich mit angegeben werden. Das er- +folgt durch Voranstellen von |JPG|, |GIF| oder |PNG| vor die Bildadresse. Beispiel: + + PICTURE=Stauwarnung Hessen,|GIF|http://www.swr3.de/info/verkehr/verkehr_images.php?img=M05 + +Da man auch Webcams anzeigen kann, welche ihr Bild in bestimmten Abständen aufrischen, kann +man New-Tuxwetter auch anweisen, das angezeigte Bild in einem vorgebbaren Intervall selbst- +ständig neu zu laden, ohne daß eine Taste gedrückt werden muß. Dazu ist eine Erweiterung des +oben beschriebenen Bildtyps um die Zahlenangabe des Updateintervalls in Sekunden erforderlich. +Der Bildtyp muß in diesem Fall also zwingend angegeben werden. Das folgende Beispiel frischt +das angezeigte Bild aller 30 Sekunden auf: + + PICTURE=Empuria-Brava,|JPG30|http://www.empuriabrava.tv/tresor/strapro.jpg + +Manche Images haben in ihrer URL eine eindeutige Zeitangabe. Um diese Bilder auch ansehen zu +können bietet Tuxwetter die Möglichkeit Platzhalter einzusetzen die zum Zeitpunkt des Aufrufs +durch aktuelle Zeit und Datum ersetzt werden. Weiter besteht die Möglichkeit, mittels Operato- +ren die Zeit zu beeinflussen, um zum Beispiel gewisse Update-Zyklen exakt treffen zu können. +Ausserdem besteht die Auswahl zwischen MESZ/MEZ und UTC. + +Das generelle Format eines Platzhalters besteht aus dem Startzeichen "|", optionalen Operatoren, +einem optionalen Offset und den Formatzeichen: |[LNR][[-]1..99999]Format + +Formatzeichen + +D : Tag +M : Monat +Y : Jahr +h : Stunde +m : Minute +s : Sekunde + +Die Anzahl der Formatzeichen bestimmt die Anzahl der Stellen mit der die Formatzeichen ersetzt +werden. Beispiel: + +"D" liefert bei Tag 1-9 eine einstellige Ausgabe "1" ... "9" wird die Zahl zweistellig wird + auch die Ausgabe zweistellig. + +"DD" liefert bei Tag 1-9 die Ausgabe "01" ... "09" ab dann normal weiter. +"DDD" liefert eben generell eine dreistellige Ausgabe "001" ... "031" +usw. + +Eine Ausnahme bildet hier das Jahr. Es wird ausser bei vierstelliger Eingabe immer die Zahl ohne +das Jahrtausend liefern (Beispiel 2004) + +"Y" = "4" +"YY" = "04" +"YYY" = "004" +"YYYY" = "2004" ! Nur hier wird das Jahrtausend mit ausgegeben! +"YYYYY" = "00004" + +Operatoren: + +"L" : Local Time (bewirkt, daß die lokale Zeit (also MEZ oder MESZ) als Zeitbasis verwendet wird. + Ohne diesen Operator wird UTC verwendet. Dieser Operator muß nur einmal vorkommen und wirkt + dann auf alle Zeitangaben +"R" : gefolgt von einer Zahl rundet den zugehörigen Platzhalter auf die Zahl oder deren Vielfaches. +"N" : gefolgt von einer Zahl bewirkt den Abzug der Zahl von dem zugehörigen Platzhalter ohne daß + diese ausgegeben wird. Ist zum Beispiel notwendig, wenn anschließend noch gerundet werden soll. +"15": gemeint ist eine beliebige Zahl die dann vom zugehörigen Platzhalter abgezogen wird. Alle abzu- + ziehenden Werte in der gesamten Adresse werden zunächst gemeinsam von der aktuellen Zeit abgezo- + gen und erst dann wird mit der Ersetzung begonnen. So kann zum Beispiel der Abzug von zwei Mi- + nuten, wenn es eine Minute nach der vollen Stunde ist, auch die Stunde verringern. Das gilt für + alle Zeitwerte. WIrd hier eine negative Zahl (Bsp. -15) angegeben, wird diese Zeit zur aktuellen + Zeit addiert, um Bilder mit einem Zeitstempel, welcher der aktuellen Zeit vorauselt, anzeigen zu + können. + +Da das ganze doch etwas trocken ist, mal ein paar Beispiele: + +Wir nehmen an, es ist der 02.01.2005 um 03:16:25 MESZ + +|YYYY|MM|DD|hh|mm|ss 20050102011625 // Stunde = 01 (UTC) +|LYYYY|MM|DD|hh|mm|ss 20050102031625 // Stunde = 03 (MESZ) +|YYYY|MM|2DD|2hh 2004123023 // 2 Tage und 2 Stunden abgezogen +|1hh|R15mm 0015 // 1 h abgezogen, Runden auf 15 min +|1hh|N15m|R15mm 0000 // 1h 15 min " , " (sichere Lösung) +|L1hh|N15m|R15mm 0200 // " aber MESZ + + +Praxis: (ein viertelstündlich aktualisiertes Bild, Datum: 13.10.2004 21:16:00 MESZ) + +http://www.wetteronline.de/daten/radar/dwdd/|YYYY/|MM/|DD|hh|R15mm.gif ergibt +http://www.wetteronline.de/daten/radar/dwdd/2004/10/131915.gif + +Das könnte knapp werden, da um 21:16 das Bild von 21:15 bestimmt noch nicht geuppt wurde, und würde der +Aufruf um 21:15 erfolgen, hätte der Server gar keinen Vorlauf mehr. Sicherer ist es daher, noch eine +viertel Stunde abzuziehen und dann erst zu runden: + +http://www.wetteronline.de/daten/radar/dwdd/|YYYY/|MM/|DD|hh|N15m|R15mm.gif ergibt +http://www.wetteronline.de/daten/radar/dwdd/2004/10/131900.gif + +Dieses Beispiel könnt Ihr direkt verwenden. + +Für Bildadressen, die sich nicht über Zeitfunktionen berechnen lassen, gibt es die Möglichkeit, diese +Adresse aus dem Quelltext der HTML-Seite extrahieren zu lassen. Dazu ist im Quelltext nach dem Bild- +namen zu suchen. Die Textstücke, die den Namen des Bildes vorn (Grenze_vorn) und hinten (Grenze_hinten) +einschließen, sollten nun bekannt sein. Um die Bildadresse ermitteln zu lassen, ist ein Eintrag in der +Form: + + PICHTML=Anzeigetext im Menü,URL_der_HTML_Seite|Grenze_vorn|Grenze_hinten + +Beispiel: +HTML-Quelltext: + .... + + + + + + + .... + +Eintrag in der tuxwetter.conf: + + PICHTML=Unwetter-Warnungen,http://www.unwetterzentrale.de/uwz/index.html| + + +Achtung!! Es koennen nur JPG- und bestimmte Typen von PNG- und GIF-Bildern dargestellt werden. Da- +bei sind jedoch auch animierte GIFs möglich, deren Einzelbilder automatisch nacheinender angezeigt +werden. + +Werden auf Internetseiten interessante Texte angezeigt, kann man sich die in begrenztem Umfang auch auf dem +Bildschirm darstellen lassen. Dazu gibt es den Typ TXTHTML. In der Syntax gleich aufgebaut wie PICHTML stellt +diese Typ den zwischen den Begrenzern gefundenen Text auf dem Bildschirm dar. Dazu werden alle HTML-Tags ent- +fernt und, wenn nötig Zeilenumbrüche für die Formatierung eingefügt. + + + TXTHTML=Anzeigetext im Menü,URL_der_HTML_Seite|Grenze_vorn|Grenze_hinten + +Beispiel-Eintrag in der tuxwetter.conf: + + TXTHTML=Waldbrandwarnung,http://www.zamg.ac.at/dyn/warnungen/waldb.htm|| Uhr + +Werden in den zu analysierenden HTML-Seiten die Links auf Bilder oder andere Seiten relativ dargestellt (also +ohne Angabe einer Serveradresse), wird davon ausgegangen, daß die Links auf das Root-Verzeichnis des Servers +verweisen. Liegen die Links nicht im Root sondern im selben Verzeichnis wie die HTML-Seite, ist der Eintrag +für diese Seite mit der Adresse "httpabs://.." einzutragen. +Beispiel: +Adresse: + + http://www.mtit.at/verkehrsbilder/scripts/getlastpicture.asp?cam=61 + +liefert als Quelltext: + + ... + + + + ... + +Dabei würde das Script "mmobjholen" in "http//www.mtit.at/" erwartet werden. Es liegt jedoch in +"http://www.mtit.at/verkehrsbilder/scripts/". Daher muß der Eintrag in der Config-Datei lauten: + + PICHTML=Auhof,|JPG|httpabs://www.mtit.at/verkehrsbilder/scripts/getlastpicture.asp?cam=61| + +Internetseiten oder auch Dateien auf Netzwerkfreigaben im reinen Textformat lassen sich mit dem Plugin eben- +falls darstellen. Dazu gibt es den Typ TXTPLAIN. Mit diesem Eintrag wird eine reine Textseite heruntergeladen +und angezeigt. + + TXTPLAIN=Anzeigetext im Menü,URL_der_Text_Seite + + +Die Wetterwarnungen des deutschen Wetterdienstes können auf separaten Textseiten dargestellt werden. +Um an die aktuellen gewünschten Adressen (URL's) für die Wetterwarnungsdaten zu kommenen, folgenderma- +ßen vorgehen. +http://www.wettergefahren.de/de/WundK/Warnungen/index.htm aufrufen. Dort auf das gewünschte Bundesland klicken, +z.B. Baden-Württemberg. +Dann regionaler Warnlagebericht anklicken, dann im folgenden Fenster auf Datei->Eigenschaften klicken. +Im Fenster Eigenschaften die Url herauskopieren. Diese Url dann mit einem Unix fähigen Editor z.B. +Ultraedit in die tuxwetter.conf einfügen. In der gleichen Zeile davor hinschreiben +TEXTPAGE=Warnlage Baden-Württemberg, +Das gewünschte Ergebnis sollte so aussehen. + +TEXTPAGE=Warnlage Baden-Württemberg,http://www.wettergefahren.de/de/WundK/Warnungen/zeige.php?WL=SU00 + +Um an die Wetterwarnungen für den Landkreis zu kommen, den Landkreis auf der Wetterwarnungskarte +des Bundeslandes anklicken. Ich möchte dies hier am Beispiel Reutlingen erklären. Ihr klickt in der +Wetterwarnungskarte von Baden-Württemberg auf den Landkreis Reutlingen. Dann im folgenden Fenster auf +Datei->Eigenschaften klicken. Im Fenster Eigenschaften die Url herauskopieren. Diese Url dann mit einem +Unix fähigen Editor z.B. Ultraedit in die tuxwetter.conf einfügen. In der gleichen Zeile davor hinschreiben +TEXTPAGE=Warnstatus Reutlingen, +Das gewünschte Ergebnis sollte so aussehen. + +TEXTPAGE=Warnstatus Reutlingen,http://www.wettergefahren.de/de/WundK/Warnungen/zeige.php?ID=RT#O + +Sollen bestimmte Programme oder Scripte aufgerufen werden, kann der Eintrag "EXECUTE=" verwendet +werden. Er führt den eingetragenen Text auf der Kommandozeile aus. Die Syntx ist: + + EXECUTE=Anzeigename im Menü,auszuführendes Kommando + +Beispiel: + + EXECUTE=Box neu starten,reboot + +Zu den Tasten: + +Bei Anzeige eines Bildes kann mittels der Hoch-/Runter-Tasten zum nächsten oder vorhergehenden Bild +gewechselt werden, ohne erst über das Menü zu gehen. Um trotzdem darüber zu informieren, welches +Bild gerade angezeigt wird, wird der Menüname des Bildes zusätzlich noch auf dem LCD-Display der Box +angezeigt. Geschlossen wird die Grafik-Anzeige mit der OK-Taste. +Ein animiertes GIF kann nach seinem Ablauf mi der Rechts-Taste erneut gestartet werden, ohne daß es +erst noch mal aus dem Internet geladen wird. Die Links-Taste führt zum erneuten Download des letzten +Bildes. Das ist vor allem für das Betrachten von WebCam-Bildern vorgesehen. +Während des Ladens und Konvertierens von Bildern wird in der linken oberen Bildschirmecke das vom +Pictureviewer her bekannte "Busy-Symbol", ein kleines rotes Rechteck eingeblendet, um darauf hinzu- +weisen, daß die Box beschäftigt ist. +Bei längeren Warnmeldungen (erkennbar am Zeichen ">>" in der linken unteren Ecke") kann mit der Rechts- +Taste um 5 Zeilen vor- und mit der Links-Taste um 5 Zeilen zurückgescrollt werden. + +Bei Bildern größer 100 kB, wird in der 1.Zeile des LCD-Displays der Dbox ein Ladefortschrittsbalken +angezeigt. Darunter wird der Name des Bilds eingeblendet. Es konnte aber kein korrekter Zeilenumbruch +implementiert werden, da das Wetterplugin sonst zu groß geworden wäre. (Die Box ist ja kein Duden :-).) + +Nach Anpassung der tuxwetter.conf und Neustart der Box steht das Plugin unter dem Menü der blauen +Taste als "Wettervorhersage" zur Verfügung. + +Wem die auf dem LCD-Display angezeigten Wettersymbole zu spartanisch sind, kann die Datei +bmps.tar.Z aus dem Ordner "alternative LCD-Symbole" ins Verzeichnis /var/plugins/tuxwet +kopieren (die alte Datei überschreiben). das ist, wie so Vieles, immer eine Geschmacksfrage. + +Zur Bedienung: Die Menüs werden über die Home-Taste, die Wetter- und Grafik-Anzeigen sowohl über die +HOME- als auch über die OK-Taste geschlossen. Auch innerhalb der Datenanzeigen kann mittels der Hoch- +/Runter-Tasten zum jeweils vorhergehenden oder folgenden Eintrag gewechselt werden. +Zum vorhergenden Menü gelangt man mit der HOME-Taste. Die Standby-Taste beendet das Programm aus +allen Menüebenen heraus. + +Eine Hilfebildschirm, welcher alle Tasten und deren Funktionen beschreibt, kann mit der Taste "?" +aufgerufen werden. Auch die aktuelle Programmversion wird in der Titelzeile angezeigt. Dieser +Hilfebildschirm wird auch mit der OK-Taste wieder geschlossen. + +Da bei einigen Images das Problem auftrat, daß bei längerer Nutzung des Plugins die Uhrzeit nachging, +da der Prozessor aufgrund der Auslastung nicht mehr in der Lage war, die Berechnung der Uhrzeit wei- +terzuführen, liegt im Ordner "optionale Zeitkorrektur" ein Programm namens "swisstime". Diese Programm +holt sich von einem Schweizer Atomzeit-Server die aktuelle Zeit und setzt damit die Uhr der DBox. +Dieses Programm ist bei Bedarf in den Ordner /var/plugins/tuxwet/ zu kopieren, und mit den Rechten 755 +zu versehen. Das Plugin erkennt, ob dieses Programm vorhanden ist, und ruft es dann beim Beenden des +Plugins auf. Somit wird die Uhrzeit wieder korrigiert. Wer keine Probleme mit einer nachgehenden Uhr +hat (das ist vom Image abhängig), benötigt dieses Programm nicht. + +Die Datei convert.list dient der Übersetzung der englischen Texte vom Wetterserver in deutsche Texte. +Sollten da mal irgendwelche komischen Anzeigen bei der Wettervorsage stehen, postet bitte ins +Forum, damit die fehlerhaften Anzeigen korrigiert werden können. +Fehlende Übersetzungen werden in einer Liste gesammelt, welche aus dem Hauptmenü mit der DBox-Taste +angezeigt werden kann. Das erleichtert die Meldung solcher Übersetzungen im Board. Soll die Fehler- +liste (nach Korrektut der convert.list) gelöscht werden, kann das mit der roten Taste erfolgen, während +die Fehlerliste angezeigt wird. +Ab der Version 3.00 dient die Datei convert.list gleichzeitig der Lokalisierung aller angezeigten +Texte. Im unteren Teil befinden sich dafür die originalen deutschen Meldungen, gefolgt von dem Zeichen +"|". Unmittelbar danach kann man eintragen, was statt dieses Textes angezeigt werden soll. Das kann +sowohl eine Fremdsprache sein als auch eine deutsche Meldung, welche Euch besser als die originale +gefällt. Dabei aber bitte beachten, daß der neue Text bei den Meldungen für die Datenanzeige nicht länger +als der in der Anzeige zur Verfügung stehende Platz werden sollte, da sonst die Formatierung der An- +zeige darunter leiden würde. Steht kein neuer Text hinter dem "|", wird der Originaltext verwendet. + +Wer sich eine so große tuxwetter.conf zusammengestellt hat, daß Schwierigkeiten mit dem Platz auf der +Box auftauchen, kann die tuxwetter.conf auch auf den PC auslagern und mit dem Plugin über ein vorher +gemountetes Verzeichnis darauf zugreifen. Dazu kann tuxwetter sowohl aus der tuxwetter.so als auch von +der Kommandozeile aus mit einem Parameter für die zu verwendende Konfigurationsdatei aufgerufen werden. +Der abweichende Pfad zur Config-Datei kann in der tuxwetter.so mit einem Hex-Editor ab Adresse 1E35H +eingetragen werden. Ist zum Beispiel das Verzeichnis /mnt/configs/ gemountet, und auf diesem befindet +sich eine tuxwetter.conf auf dem PC, wird in der tuxwetter.so ab Adresse 1E35H die Zeichenfolge + + /mnt/configs/tuxwetter.conf + +eingetragen, oder das Plugin so über die Kommandozeile (z.B. aus dem FlexMenü) aufgerufen: + + /var/plugins/tuxwet/tuxwetter /mnt/configs/tuxwetter.conf + +Wird kein Kommandozeilenparameter angegeben oder wurde die als Kommandozeilenparameter angegebene Config +nicht gefunden (Verzeichnis nicht gemountet), verwendet das Plugin die Datei + + /var/plugins/tuxwet/tuxwetter.conf. + +Wird New-Tuxwetter zusätzlich mit einem Aktionseintrag als Kommandozeilenparameter aufgerufen, so führt +es die entsprechende Aktion sofort aus, und beendet sich wieder, wenn die Aktion abgeschlossen wurde. +Somit kann New-Tuxwetter nun auch als aus Scripten heraus aufrufbarer Bildbetrachter oder Textviewer +verwendet werden. +Beispiel: + + /var/plugins/tuxwet/tuxwetter 'PICTURE=Teletarif Bild,http://www.teltarif.de/db/blitz.gif?preis=1&ziel=Ortsgespr~ach,Fern,Mobilfunk&ve=1&blank=1&019x=0&width=249&height=200' + +zeigt sofort die aktuellen Telefontarife auf dem Bildschirm an, und beendet sich nach Schließen des Bildes. +Folgende Aktionen können als Kommandozeilenparameter verwendet werden: PICTURE, PICHTML, TXTHTML,TEXTPAGE, +TXTPLAIN und EXECUTE. Der Kommandozeilenparameter ist unbedingt in einfache Hochkommasn einzuschließen, +um die Kommandozeile komplett einschließlich Leerzeichen in den ersten Parameter übergeben zu können. Da +die Kommandozeile keine Umlaute und Sonderzeichen übergeben kann, sind, wie im Beispiel, die Sonderzeichen +durch eine vorangestellte Tilde zu kennzeichnen. Folgende Sonderzeichen werden unterstützt: + + ~a ä + ~o ö + ~u ü + ~A Ä + ~O Ö + ~U Ü + ~z ß + ~d ° (degree) + +Um die Version von New-Tuxwetter über die Kommadozeile abzufragen, wird tuxwetter mit dem Parameter -v oder +--Version aufgerufen. In diesem Fall gibt Tuxwetter nur seine Version auf die Konsole aus und beendet sich +anschließend selbst. + +Zur Konfiguration des Plugins über das Flexible Menü-Plugin (FlexMenü) befindet sich ein Unterordner mit +dem in die shellexec.conf einzufügenden Abschnitt, ein zugehöriges Script (twops, benötigt die Rechte 755) +und die zusätzlich erforderliche Config-Datei tuxwetter.mcf im Verzeichnis "Konfiguration über FlexMenü". +Thx to MailMan für die Erstellung der FlexMenü-Konfiguration. + + +Also, viel Spaß und viel Erfolg + +Das New-Tuxwetter-Team +SnowHead, Worschter, Seddi und Sanguiniker diff --git a/resize.c b/resize.c new file mode 100644 index 0000000..8815623 --- /dev/null +++ b/resize.c @@ -0,0 +1,92 @@ +/* + * $Id: resize.c,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include + +unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy) +{ +// dbout("simple_resize{\n"); + unsigned char *cr,*p,*l; + int i,j,k,ip; + cr=(unsigned char*) malloc(dx*dy*3); + if(cr==NULL) + { + printf("Error: malloc\n"); +// dbout("simple_resize}\n"); + return(orgin); + } + l=cr; + + for(j=0;j=ox) xb=ox-1; + yb=(j+1)*oy/dy; if(yb>=oy) yb=oy-1; + for(l=ya,r=0,g=0,b=0,sq=0;l<=yb;l++) + { + q=orgin+((l*ox+xa)*3); + for(k=xa;k<=xb;k++,q+=3,sq++) + { + r+=q[0]; g+=q[1]; b+=q[2]; + } + } + p[0]=r/sq; p[1]=g/sq; p[2]=b/sq; + } + } + free(orgin); +// dbout("color_average_resize}\n"); + return(cr); +} diff --git a/resize.h b/resize.h new file mode 100644 index 0000000..57785f7 --- /dev/null +++ b/resize.h @@ -0,0 +1,28 @@ +/* + * $Id: resize.h,v 1.1 2009/12/19 19:42:49 rhabarber1848 Exp $ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#ifndef __RESIZE_H__ +#define __RESIZE_H__ + +unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy); +unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy); + +#endif diff --git a/startbild.jpg b/startbild.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcda64feddd60a532658cb32448b09f5981cdc6e GIT binary patch literal 32357 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%0Dwf59#93(z^x15*f9NdvotY#`5G6zqyh!7gFqkv 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 literal 0 HcmV?d00001 diff --git a/starter.c b/starter.c new file mode 100644 index 0000000..767c1ba --- /dev/null +++ b/starter.c @@ -0,0 +1,53 @@ +/* + * $Id$ + * + * tuxwetter - d-box2 linux project + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * +*/ + +#include +#include +#include +#include +#include +#define SCRIPT "tuxwetter" + +int main() +{ + int ret, pid, status; + pid=fork(); + if (pid == -1) { + fprintf(stderr, "[%s.so] fork\n", SCRIPT); + return; + } else + if (pid == 0) { + fprintf(stderr, "[%s.so] forked, executing %s\n", SCRIPT, SCRIPT); + for (ret=3 ; ret < 255; ret++) + close (ret); + ret = system(SCRIPT); + if (ret) + fprintf(stderr, "[%s.so] script return code: %d (%m)\n", SCRIPT, ret); + else + fprintf(stderr, "[%s.so] script return code: %d\n", SCRIPT, ret); + _exit(ret); + } + fprintf(stderr, "[%s.so] parent, waiting for child with pid %d...\n", SCRIPT, pid); + waitpid(pid, &status, 0); + fprintf(stderr, "[%s.so] parent, waitpid() returned..\n", SCRIPT); + if (WIFEXITED(status)) + fprintf(stderr, "[%s.so] child returned with status %d\n", SCRIPT, WEXITSTATUS(status)); +} diff --git a/text.c b/text.c new file mode 100644 index 0000000..7c9ddcb --- /dev/null +++ b/text.c @@ -0,0 +1,369 @@ +#include "text.h" +#include "gfx.h" +#include "io.h" + +int FSIZE_BIG=28; +int FSIZE_MED=24; +int FSIZE_SMALL=20; +int FSIZE_VSMALL=16; +int TABULATOR=72; +unsigned sc[8]={'a','o','u','A','O','U','z','d'}, tc[8]={'ä','ö','ü','Ä','Ö','Ü','ß','°'}; + +/****************************************************************************** + * MyFaceRequester + ******************************************************************************/ + +FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface) +{ + FT_Error result; + + result = FT_New_Face(library, face_id, 0, aface); + + if(result) printf("msgbox \n", (char*)face_id); + + return result; +} + +/****************************************************************************** + * RenderChar + ******************************************************************************/ + +int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, int color) +{ +// unsigned char pix[4]={oldcmap.red[col],oldcmap.green[col],oldcmap.blue[col],oldcmap.transp[col]}; +// unsigned char pix[4]={0x80,0x80,0x80,0x80}; + unsigned char pix[4]={bl[color],gn[color],rd[color],tr[color]}; + int row, pitch, bit, x = 0, y = 0; + FT_UInt glyphindex; + FT_Vector kerning; + FT_Error error; + + currentchar=currentchar & 0xFF; + + //load char + + if(!(glyphindex = FT_Get_Char_Index(face, (int)currentchar))) + { +// printf("msgbox \n", (int)currentchar, error); + return 0; + } + +// no kerning used +/* + if(use_kerning) + { + FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning); + + prev_glyphindex = glyphindex; + kerning.x >>= 6; + } + else +*/ + kerning.x = 0; + + //render char + + if(color != -1) /* don't render char, return charwidth only */ + { + if(sx + sbit->xadvance >= ex) return -1; /* limit to maxwidth */ + + for(row = 0; row < sbit->height; row++) + { + for(pitch = 0; pitch < sbit->pitch; pitch++) + { + for(bit = 7; bit >= 0; bit--) + { + if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */ + + if((sbit->buffer[row * sbit->pitch + pitch]) & 1<left + kerning.x + x)*4 + fix_screeninfo.line_length*(starty + sy - sbit->top + y),pix,4); + + x++; + } + } + + x = 0; + y++; + } + + } + + //return charwidth + + return sbit->xadvance + kerning.x; +} + +/****************************************************************************** + * GetStringLen + ******************************************************************************/ + +int GetStringLen(int sx, char *string, int size) +{ +int i, found; +int stringlen = 0; + + //reset kerning + + prev_glyphindex = 0; + + //calc len + + if(size) + { + desc.width = desc.height = size; + } + + while(*string != '\0') + { + if(*string != '~') + { + stringlen += RenderChar(*string, -1, -1, -1, -1); + } + else + { + string++; + if(*string=='t') + { + stringlen=desc.width+TABULATOR*((int)(stringlen/TABULATOR)+1); + } + else + { + if(*string=='T') + { + if(sscanf(string+1,"%4d",&i)==1) + { + string+=4; + stringlen=i-sx; + } + } + else + { + found=0; + for(i=0; i maxwidth */ + sx += charwidth; + } + else + { + switch(*rptr) + { + case 'R': varcolor=RED; break; + case 'G': varcolor=GREEN; break; + case 'Y': varcolor=YELLOW; break; + case 'B': varcolor=BLUE0; break; + case 'S': varcolor=color; break; + case 't': + sx=TABULATOR*((int)(sx/TABULATOR)+1); + break; + case 'T': + if(sscanf(rptr+1,"%4d",&i)==1) + { + rptr+=4; + sx=i; + } + break; + } + } + } + else + { + if (*rptr==0xC3) + { + ++rptr; + switch(*rptr) + { + case 0x84: *rptr='Ä'; break; + case 0x96: *rptr='Ö'; break; + case 0x9C: *rptr='Ü'; break; + case 0xA4: *rptr='ä'; break; + case 0xB6: *rptr='ö'; break; + case 0xBC: *rptr='ü'; break; + case 0x9F: *rptr='ß'; break; + default : *rptr='.'; break; + } + } + if((charwidth = RenderChar(*rptr, sx, sy, ex, varcolor)) == -1) return sx; /* string > maxwidth */ + sx += charwidth; + } + rptr++; + } + return stringlen; +} + +/****************************************************************************** + * ShowMessage + ******************************************************************************/ + +void ShowMessage(char *message, int wait) +{ + extern int radius; + int mxw=400, myw=120+40*wait, mhw=30; + int msx,msy; + char *tdptr; + + Center_Screen(mxw, myw, &msx, &msy); + + //layout + + RenderBox(msx, msy, mxw, myw, radius, CMH); + RenderBox(msx+2, msy+2, mxw-4, myw-4, radius, CMC); + RenderBox(msx, msy, mxw, mhw, radius, CMH); + + //message + + tdptr=strdup("Tuxwetter Info"); + RenderString(tdptr, msx+2, msy+(mhw-4), mxw-4, CENTER, FSIZE_MED, CMHT); + free(tdptr); + tdptr=strdup(message); + RenderString(tdptr, msx+2, msy+mhw+((myw-mhw)/2)-FSIZE_MED/2+(!wait*15), mxw-4, CENTER, FSIZE_MED, CMCT); + free(tdptr); + + if(wait) + { + RenderBox(msx+mxw/2-25, msy+myw-45, 50, FSIZE_SMALL*3/2, radius, CMCS); + RenderString("OK", msx+mxw/2-26, msy+myw-42+FSIZE_SMALL, 50, CENTER, FSIZE_SMALL, CMCT); + } + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + + while(wait && (GetRCCode() != KEY_OK)); + + +} + +void TranslateString(char *src) +{ +int i,found; +char rc,*rptr=src,*tptr=src; + + while(*rptr != '\0') + { + if(*rptr=='~') + { + ++rptr; + rc=*rptr; + found=0; + for(i=0; i Treffer + # mehrere Worte -> Uebereinstimmungen + + if [ `echo $suche | grep -c " "` -gt 0 ] + then +# leosuche="`echo $suche | sed 's/ /+/g'`" + startstring="bereinstimmungen" + else +# leosuche=$suche + startstring="Unmittelbare Treffer" + fi + leosuche=`echo $suche | sed "s/' '/'+'/g;s/~A/Ä/g;s/~O/Ö/g;s/~U/Ü/g;s/~a/ä/g;s/~o/ö/g;s/~u/ü/g;s/~s/ß/g"` + + # http://pda.leo.org/?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&relink=on§Hdr=on&spellToler=std&search=das+Haus + + wget -O /tmp/pdaleo.tmp 'http://pda.leo.org/?lp='$lang'&lang=de&searchLoc=0&cmpType=relaxed&relink=on§Hdr=on&spellToler=std&search='$leosuche + sed 's/ //g + s/<\/td>/\n/g + s/<\n\n>/\n/g + s//~G/g + s/<\/B>/~S/g + s/\®//g + s/Ä/Ä/g + s/Ö/Ö/g + s/Ü/Ü/g + s/ä/ä/g + s/ö/ö/g + s/ü/ü/g + s/ß/ß/g' /tmp/pdaleo.tmp > /tmp/pdaleo.html + +# suche=`echo $suche | sed "s/Ä/Ä/g;s/Ö/Ö/g;s/Ü/Ü/g;s/ä/ä/g;s/ö/ö/g;s/ü/ü/g;s/ß/ß/g;s/Â//g;s/–/---/g;s/é/é/g;s/ó/ó/g"` + /var/plugins/tuxwet/tuxwetter "TXTHTML=~Ubersetzung f~ur ~G$suche,$url|$startstring|table>" + + rm /tmp/pdaleo.* + fi + + done + +fi \ No newline at end of file diff --git a/tuxwetter.c b/tuxwetter.c new file mode 100644 index 0000000..19a390b --- /dev/null +++ b/tuxwetter.c @@ -0,0 +1,3598 @@ +/* + * tuxwetter.c - TuxBox Weather Plugin + * + * Copyright (C) 2004 SnowHead + * Worschter + * + * 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. + * + * $Id: tuxwetter.c,v 3.18 2010/06/18 20:00 SnowHead $ + */ + +//getline needed #define _GNU_SOURCE +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +//#include +#include "tuxwetter.h" +#include "parser.h" +#include "text.h" +#include "io.h" +#include "gfx.h" +#include "php.h" +#include "http.h" +#include "jpeg.h" +#include "pngw.h" +#include "gif.h" +#include "fb_display.h" +#include "resize.h" +#include "gifdecomp.h" + +#define P_VERSION "3.03" + +#ifndef HAVE_DREAMBOX_HARDWARE +char CONVERT_LIST[]="/var/tuxbox/config/tuxwetter/convert.list"; +#define CFG_FILE "/var/tuxbox/config/tuxwetter/tuxwetter.conf" +#define MCF_FILE "/var/tuxbox/config/tuxwetter/tuxwetter.mcfg" +#define TIME_FILE "/var/tuxbox/config/tuxwetter/swisstime" +//#define MISS_FILE "/var/tuxbox/config/tuxwetter/missing_translations.txt" +#else +char CONVERT_LIST[]="/var/bin/tuxwet/convert.list"; +#define CFG_FILE "/var/bin/tuxwet/tuxwetter.conf" +#define MCF_FILE "/var/bin/tuxwet/tuxwetter.mcfg" +#define TIME_FILE "/var/bin/tuxwet/swisstime" +#define MISS_FILE "/var/bin/tuxwet/missing_translations.txt" +#endif +#define NCF_FILE "/var/tuxbox/config/neutrino.conf" +#define ECF_FILE "/var/tuxbox/config/enigma/config" +#define BMP_FILE "tuxwettr.bmp" +#define JPG_FILE "/tmp/picture.jpg" +#define GIF_FILE "/tmp/picture.gif" +#define GIF_MFILE "/tmp/gpic" +#define PNG_FILE "/tmp/picture.png" +#define PHP_FILE "/tmp/php.htm" +#define TMP_FILE "/tmp/tuxwettr.tmp" +#define ICON_FILE "/tmp/icon.gif" +#define TRANS_FILE "/tmp/picture.html" +static char TCF_FILE[128]=""; + +#define LIST_STEP 10 +#define MAX_FUNCS 7 +#define LCD_CPL 12 +#define LCD_RDIST 10 + +// Forward defines +int pic_on_data(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int single, int center, int rahmen); +char par[32]="1005530704", key[32]="a9c95f7636ad307b"; +void TrimString(char *strg); + +// Color table stuff +static char menucoltxt[][25]={"Content_Selected_Text","Content_Selected","Content_Text","Content","Content_inactive_Text","Content_inactive","Head_Text","Head"}; +//static char spres[][5]={"","_crt","_lcd"}; + +//#define FONT "/usr/share/fonts/md_khmurabi_10.ttf" +#define FONT2 "/share/fonts/pakenham.ttf" +// if font is not in usual place, we look here: +#define FONT "/share/fonts/neutrino.ttf" + +// CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH +// WHITE, BLUE0, TRANSP, CMS, ORANGE, GREEN, YELLOW, RED +// CMCP0, CMCP1, CMCP2, CMCP3 +unsigned char bl[] = { 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, + 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; +unsigned char gn[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xC0, 0x00, + 0xFF, 0x80, 0x00, 0x80, 0xC0, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00}; +unsigned char rd[] = { 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00}; +unsigned char tr[] = { 0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0x80, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00}; + +// Menu structure stuff +enum {TYP_MENU, TYP_CITY, TYP_PICTURE, TYP_PICHTML, TYP_TXTHTML, TYP_TEXTPAGE, TYP_TXTPLAIN, TYP_EXECUTE, TYP_ENDMENU, TYP_WEATH}; +static char TYPESTR[TYP_WEATH+1][10]={"MENU=","Stadt=","PICTURE=","PICHTML=","TXTHTML=","TEXTPAGE=","TXTPLAIN=","EXECUTE=","ENDMENU"}; +enum {PTYP_ASK, PTYP_JPG, PTYP_GIF, PTYP_PNG}; +static char PTYPESTR[PTYP_PNG+1][5]={"","JPG","GIF","PNG"}; +char *cmdline=NULL; +char *line_buffer=NULL; + +typedef struct {char *entry; int headerpos; int type; int pictype; int repeat; int underline; int absolute;} LISTENTRY; +typedef LISTENTRY *PLISTENTRY; +typedef PLISTENTRY *LIST; +typedef struct {int num_headers; int act_header; int max_header; char **headertxt; int *headerlevels; int *lastheaderentrys; int num_entrys; int act_entry; int max_entrys; LIST list;} MENU; + +MENU menu; +MENU funcs; + +int Check_Config(void); +int Clear_List(MENU *m, int mode); +int Get_Selection(MENU *m); +int AddListEntry(MENU *m, char *line, int pos); +int Get_Menu(); +void ShowInfo(MENU *m); + +// Misc +char NOMEM[]="Tuxwetter \n"; +unsigned char *lfb = 0, *lbb = 0; +int intype=0, show_icons=0, gmodeon=0, ctmo=0, metric=1, loadalways=0, radius=0; +char city_code[30] = ""; +char city_name[50] = ""; +unsigned int alpha=0x0202; +int show_splash=0; +char lastpicture[BUFSIZE]=""; +char nstr[BUFSIZE]=""; +char *trstr; +char *htmstr; +unsigned char *proxyadress=NULL, *proxyuserpwd=NULL; +char INST_FILE[]="/tmp/rc.locked"; +char LCDL_FILE[]="/tmp/lcd.locked"; +int instance=0; + +int get_instance(void) +{ +FILE *fh; +int rval=0; + + if((fh=fopen(INST_FILE,"r"))!=NULL) + { + rval=fgetc(fh); + fclose(fh); + } + return rval; +} + +void put_instance(int pval) +{ +FILE *fh; + + if(pval) + { + if((fh=fopen(INST_FILE,"w"))!=NULL) + { + fputc(pval,fh); + fclose(fh); + } + if(pval==1) + { + if((fh=fopen(LCDL_FILE,"w"))!=NULL) + { + fputc(0,fh); + fclose(fh); + } + } + } + else + { + remove(INST_FILE); + remove(LCDL_FILE); + } +} + +static void quit_signal(int sig) +{ + put_instance(get_instance()-1); + printf("tuxwetter Version %s killed\n",P_VERSION); + exit(1); +} + +void xremove(char *fname) +{ +FILE *fh; + + if((fh=fopen(fname,"r"))!=NULL) + { + fclose(fh); + remove(fname); + } +} + +int Read_Neutrino_Cfg(char *entry) +{ +FILE *nfh; +char tstr [512], *cfptr=NULL; +int rv=-1,styp=0; + + if((((nfh=fopen(NCF_FILE,"r"))!=NULL)&&(styp=1)) || ((((nfh=fopen(ECF_FILE,"r"))!=NULL))&&(styp=2))) + { + tstr[0]=0; + + while((!feof(nfh)) && ((strstr(tstr,entry)==NULL) || ((cfptr=strchr(tstr,'='))==NULL))) + { + fgets(tstr,500,nfh); + } + if(!feof(nfh) && cfptr) + { + ++cfptr; + if(styp==1) + { + if(sscanf(cfptr,"%d",&rv)!=1) + { + if(strstr(cfptr,"true")!=NULL) + rv=1; + else if(strstr(cfptr,"false")!=NULL) + rv=0; + else + rv=-1; + } + } + if(styp==2) + { + if(sscanf(cfptr,"%x",&rv)!=1) + { + rv=-1; + } + } +// printf("%s\n%s=%s -> %d\n",tstr,entry,cfptr,rv); + } + fclose(nfh); + } + return rv; +} + +/****************************************************************************** + * ReadConf (0=fail, 1=done) + ******************************************************************************/ + +int ReadConf(char *iscmd) +{ + FILE *fd_conf; + char *cptr; + + //open config + + if((!strlen(TCF_FILE)) || (strlen(TCF_FILE) && !(fd_conf = fopen(TCF_FILE, "r")))) + { + if(!(fd_conf = fopen(CFG_FILE, "r"))) + { + if(iscmd==NULL) + { + printf("Tuxwetter \n"); + return 0; + } + } + else + { + strcpy(TCF_FILE,CFG_FILE); + } + } + if(fd_conf) + { + fclose(fd_conf); + } + if(!(fd_conf = fopen(MCF_FILE, "r"))) + { + fd_conf = fopen(TCF_FILE, "r"); + } + + while(fgets(line_buffer, BUFSIZE, fd_conf)) + { + TrimString(line_buffer); + + if((line_buffer[0]) && (line_buffer[0]!='#') && (!isspace(line_buffer[0])) && ((cptr=strchr(line_buffer,'='))!=NULL)) + { + if(strstr(line_buffer,"SplashScreen") == line_buffer) + { + sscanf(cptr+1,"%d",&show_splash); + } + if(strstr(line_buffer,"ShowIcons") == line_buffer) + { + sscanf(cptr+1,"%d",&show_icons); + } + if(strstr(line_buffer,"ProxyAdressPort") == line_buffer) + { + proxyadress=strdup(cptr+1); + } + if(strstr(line_buffer,"ProxyUserPwd") == line_buffer) + { + proxyuserpwd=strdup(cptr+1); + } + if(strstr(line_buffer,"ConnectTimeout") == line_buffer) + { + sscanf(cptr+1,"%d",&ctmo); + } + if(strstr(line_buffer,"Metric") == line_buffer) + { + sscanf(cptr+1,"%d",&metric); + } + if(strstr(line_buffer,"LoadAlways") == line_buffer) + { + sscanf(cptr+1,"%d",&loadalways); + } + if(strstr(line_buffer,"PartnerID") == line_buffer) + { + strncpy(par,cptr+1,sizeof(par)-1); + } + if(strstr(line_buffer,"LicenseKey") == line_buffer) + { + strncpy(key,cptr+1,sizeof(key)-1); + } + if(strstr(line_buffer,"InetConnection") == line_buffer) + { + if(strstr(cptr+1,"ISDN")!=NULL) + { + intype=1; + } + if(strstr(cptr+1,"ANALOG")!=NULL) + { + intype=2; + } + } + +/* if(strstr(line_buffer,"FONT=") == line_buffer) + { + strcpy(FONT,strchr(line_buffer,'=')+1); + } + if(strstr(line_buffer,"FONTSIZE=") == line_buffer) + { + sscanf(strchr(line_buffer,'=')+1,"%d",&FSIZE_MED); + FSIZE_FSIZE_BIG=(FSIZE_MED*4)/3; + FSIZE_SMALL=(FSIZE_MED*4)/5; + } +*/ + } + } + + return 1; +} + +int Transform_Entry(char *src, char *trg) +{ +int type=0,tret=-1,fcnt,fpos,tval,ferr,tsub; +int noprint,rndval,loctime=0; +char /*pstr[512],nstr[512],dstr[50],*/fstr[5],*cptr,*tptr,*aptr; +time_t stime; +struct tm *tltime; + + type=0; + tsub=0; + *trg=0; + if((cptr=strchr(src,','))==NULL) + { + return tret; + } + cptr++; + aptr=strchr(cptr,'|'); + if(aptr) + { + while(aptr && ((aptr=strchr(aptr,'|'))!=NULL)) + { + ++aptr; + rndval=0; + if(*aptr=='L') + { + ++aptr; + loctime=1; + } + if(*aptr=='R') + { + ++aptr; + rndval=1; + } + if(*aptr=='N') + { + ++aptr; + } + if(sscanf(aptr,"%d",&tval)==1) + { + while((aptr<(cptr+strlen(cptr))) && (*aptr=='-' || ((*aptr>='0') && (*aptr<='9')))) + { + ++aptr; + } + if(!rndval) + { + switch(*aptr) + { + case 'Y': tsub+=tval*365*24*3600; break; + case 'M': tsub+=tval*31*24*3600; break; + case 'D': tsub+=tval*24*3600; break; + case 'h': tsub+=tval*3600; break; + case 'm': tsub+=tval*60; break; + case 's': tsub+=tval; break; + } + } + } + } + time(&stime); + stime-=tsub; + if(loctime) + { + tltime=localtime(&stime); + } + else + { + tltime=gmtime(&stime); + } +// strncpy(nstr,src,cptr-src); +// ++cptr; + fpos=0; + ferr=0; + tval=0; + while(*cptr>' ' && !ferr) + { + if(*cptr=='|') + { + noprint=0; + rndval=0; + ++cptr; + if(*cptr=='L') + { + ++cptr; + } + if(*cptr=='N') + { + noprint=1; + ++cptr; + } + if(*cptr=='R') + { + ++cptr; + sscanf(cptr,"%d",&rndval); + rndval=abs(rndval); + } + while(*cptr && ((*cptr=='-') || ((*cptr>='0') && (*cptr<='9')))) + { + cptr++; + } + tptr=cptr+1; + fcnt=1; + while(*tptr && (*tptr==*cptr)) + { + fcnt++; + tptr++; + } + sprintf(fstr,"%%0%dd",fcnt); + switch(*cptr) + { + case 'Y': + if(fcnt==4) + { + tval=1900+tltime->tm_year; + } + else + { + tval=tltime->tm_year-100; + } + break; + + case 'M': + tval=tltime->tm_mon+1; + break; + + case 'D': + tval=tltime->tm_mday; + break; + + case 'h': + tval=tltime->tm_hour; + break; + + case 'm': + tval=tltime->tm_min; + break; + + case 's': + tval=tltime->tm_sec; + break; + + default: + ferr=1; + break; + } + if(!ferr && !noprint) + { + if(rndval) + { + tval=((int)(tval/rndval))*rndval; + } + sprintf(trg+fpos,fstr,tval); + fpos+=fcnt; + } + cptr=tptr; + } + else + { + *(trg+(fpos++))=*cptr; + ++cptr; + } + } + *(trg+fpos)=0; + tret=ferr; + } + else + { + ferr=0; + tret=0; + strcpy(trg,cptr); + strcpy(nstr,src); + if((cptr=strchr(nstr,','))!=NULL) + { + *cptr=0; + } + } + return tret; +} + + +void TrimString(char *strg) +{ +char *pt1=strg, *pt2=strg; + + while(*pt2 && *pt2<=' ') + { + ++pt2; + } + if(pt1 != pt2) + { + do + { + *pt1=*pt2; + ++pt1; + ++pt2; + } + while(*pt2); + *pt1=0; + } + while(strlen(strg) && strg[strlen(strg)-1]<=' ') + { + strg[strlen(strg)-1]=0; + } +} + + +int Check_Config(void) +{ +int rv=-1, level=0; +char *pt1; +FILE *fh; + + if((fh=fopen(TCF_FILE,"r"))!=NULL) + { + while(fgets(line_buffer, BUFSIZE, fh)) + { + TrimString(line_buffer); + if(strstr(line_buffer,TYPESTR[TYP_MENU])==line_buffer) + { + if(menu.num_headers>=menu.max_header) + { + if((menu.headertxt=realloc(menu.headertxt,(menu.max_header+LIST_STEP)*sizeof(char*)))==NULL) + { + printf(NOMEM); + Clear_List(&menu,0); + return rv; + } + memset(&menu.headertxt[menu.max_header],0,LIST_STEP*sizeof(char*)); + if((menu.headerlevels=realloc(menu.headerlevels,(menu.max_header+LIST_STEP)*sizeof(int)))==NULL) + { + printf(NOMEM); + Clear_List(&menu,0); + return rv; + } + if((menu.lastheaderentrys=realloc(menu.lastheaderentrys,(menu.max_header+LIST_STEP)*sizeof(int)))==NULL) + { + printf(NOMEM); + Clear_List(&menu,0); + return rv; + } + menu.max_header+=LIST_STEP; + } + pt1=strchr(line_buffer,'='); + if(*(++pt1)=='*') + { + ++pt1; + } + if(menu.headertxt[menu.num_headers]) + { + free(menu.headertxt[menu.num_headers]); + menu.headertxt[menu.num_headers]=NULL; + } + menu.headerlevels[menu.num_headers]=level++; + menu.headertxt[menu.num_headers++]=strdup(pt1); + } + else + { + if(strstr(line_buffer,TYPESTR[TYP_ENDMENU])==line_buffer) + { + --level; + } + } + } + rv=0; + fclose(fh); + } + return rv; +} + +int Clear_List(MENU *m, int mode) +{ +int i; +PLISTENTRY entr; + + if(m->max_entrys) + { + for(i=0; inum_entrys; i++) + { + if(m->list[i]->entry) free(m->list[i]->entry); + free(m->list[i]); + } + m->num_entrys=0; + m->max_entrys=0; + m->list=NULL; + } + switch(mode) + { + case 0: return 0; + + case 1: + + if((m->list=calloc(LIST_STEP,sizeof(PLISTENTRY)))==NULL) + { + printf(NOMEM); + return -1; + } + + for(i=0; ilist[i]=entr; + } + m->max_entrys=LIST_STEP; + break; + + case -1: + if(m->num_headers && m->headertxt) + { + for(i=0; inum_headers; i++) + { + free(m->headertxt[i]); + } + m->num_headers=0; + m->list=NULL; + } + if(m->headertxt) + { + free(m->headertxt); + m->headertxt=NULL; + } + break; + } + return 0; +} + +int Get_Selection(MENU *m) +{ +int rv=1,rccode, mloop=1; +//int lrow,lpos; +//char dstr[128]; +char *lcptr = NULL, *lcstr= NULL, *lcdptr = NULL; +// LCD_Init(); + do{ + rccode=-1; + ShowInfo(m); + if(m->list[m->act_entry]->entry) + { + sprintf(trstr,"%s%s",(m->list[m->act_entry]->type==TYP_MENU)?"> ":"",m->list[m->act_entry]->entry); + if((lcptr=strchr(trstr,','))!=NULL) + { + *lcptr=0; + } + } + else + { + sprintf(trstr,"%s",prs_translate("Kein Eintrag",CONVERT_LIST)); + } + lcstr=strdup(trstr); + lcptr=lcdptr=lcstr; + while(*lcptr) + { + if(*lcptr=='~') + { + ++lcptr; + if(*lcptr) + { + ++lcptr; + } + } + *(lcdptr++)=*(lcptr++); + } +#if 0 + *lcptr=0; + LCD_Clear(); + LCD_draw_rectangle (0,0,119,59, LCD_PIXEL_ON,LCD_PIXEL_OFF); + LCD_draw_rectangle (3,3,116,56, LCD_PIXEL_ON,LCD_PIXEL_OFF); + lpos=strlen(lcstr); + lrow=0; + while(lpos>0) + { + strncpy(dstr,lcstr+LCD_CPL*lrow,LCD_CPL); + dstr[LCD_CPL]=0; + lpos-=LCD_CPL; + LCD_draw_string(13, (lrow+2)*LCD_RDIST, dstr); + lrow++; + } + LCD_update(); +#endif + switch((rccode = GetRCCode())) + { + case KEY_RED: + m->act_entry=(m->act_entry/10)*10; + rv=1; + mloop=0; + break; + + case KEY_GREEN: + m->act_entry=(m->act_entry/10)*10+1; + rv=1; + mloop=0; + break; + + case KEY_YELLOW: + m->act_entry=(m->act_entry/10)*10+2; + rv=1; + mloop=0; + break; + + case KEY_BLUE: + m->act_entry=(m->act_entry/10)*10+3; + rv=1; + mloop=0; + break; + + case KEY_1: + m->act_entry=(m->act_entry/10)*10+4; + rv=1; + mloop=0; + break; + + case KEY_2: + m->act_entry=(m->act_entry/10)*10+5; + rv=1; + mloop=0; + break; + + case KEY_3: + m->act_entry=(m->act_entry/10)*10+6; + rv=1; + mloop=0; + break; + + case KEY_4: + m->act_entry=(m->act_entry/10)*10+7; + rv=1; + mloop=0; + break; + + case KEY_5: + m->act_entry=(m->act_entry/10)*10+8; + rv=1; + mloop=0; + break; + + case KEY_6: + m->act_entry=(m->act_entry/10)*10+9; + rv=1; + mloop=0; + break; + + case KEY_UP: + case KEY_VOLUMEDOWN: --m->act_entry; + break; + + case KEY_DOWN: + case KEY_VOLUMEUP: ++m->act_entry; + break; + + case KEY_PAGEUP : m->act_entry-=10; + break; + + case KEY_PAGEDOWN : m->act_entry+=10; + break; + + case KEY_OK: + rv=1; + mloop=0; + break; + + case KEY_EXIT: + rv=0; + mloop=0; + break; + + case KEY_MUTE: break; + + case KEY_HELP: + rv=-99; + mloop=0; + break; + + case KEY_POWER: + rv=-1; + mloop=0; + break; + + case KEY_SETUP: + rv=-98; + mloop=0; + break; + + default: continue; + } + + if (m->act_entry>=m->num_entrys) + { + m->act_entry=0; + } + if(m->act_entry<0) + { + m->act_entry=(m->num_entrys)?m->num_entrys-1:0; + } + } while(mloop); + + ShowInfo(m); + +return rv; +} + +int AddListEntry(MENU *m, char *line, int pos) +{ +int i,j,found=0,pfound=1; +PLISTENTRY entr; +char *ptr1,*ptr2,*ptr3; + + + if(!strlen(line)) + { + return 1; + } + + if(m->num_entrys>=m->max_entrys) + { + if((m->list=realloc(m->list,(m->max_entrys+LIST_STEP)*sizeof(PLISTENTRY)))==NULL) + { + printf(NOMEM); + Clear_List(m,0); + return 0; + } + for(i=m->num_entrys; inum_entrys+LIST_STEP; i++) + { + if((entr=calloc(1,sizeof(LISTENTRY)))==NULL) + { + printf(NOMEM); + Clear_List(m,0); + return -1; + } + m->list[i]=entr; + } + m->max_entrys+=LIST_STEP; + } + + entr=m->list[m->num_entrys]; + + if(m == &funcs) + { + entr->type=TYP_WEATH; + entr->entry=strdup(line); + entr->headerpos=pos; + m->num_entrys++; + found=1; + } + else + { + for(i=TYP_MENU; !found && i<=TYP_EXECUTE; i++) + { + if((ptr1=strstr(line,TYPESTR[i]))==line) + { + ptr2=strchr(ptr1,'='); + ptr2++; + if(*ptr2=='*') + { + entr->underline=1; + while(*(++ptr2)) + { + *(ptr2-1)=*ptr2; + } + *(ptr2-1)=0; + ptr2=strchr(ptr1,'=')+1; + } + if((i==TYP_MENU) || ((ptr1=strchr(ptr2,','))!=NULL)) + { + if(i!=TYP_MENU) + { + ++ptr1; + if((ptr3=strstr(ptr1,"abs://"))!=NULL) + { + memmove(ptr3,ptr3+3,strlen(ptr3)); + entr->absolute=1; + } + else + { + entr->absolute=0; + } + if((i==TYP_PICTURE) || (i==TYP_PICHTML)) + { + if(*ptr1=='|') + { + pfound=0; + ptr2=ptr1; + ++ptr1; + for(j=PTYP_JPG; !pfound && j<=PTYP_PNG; j++) + { + if(strncasecmp(ptr1,PTYPESTR[j],3)==0) + { + pfound=1; + entr->pictype=j; + ptr1+=3; + if(sscanf(ptr1,"%d",&(entr->repeat))!=1) + { + entr->repeat=0; + } + ptr1=strchr(ptr1,'|'); + while(ptr1 && (*(++ptr1))) + { + *(ptr2++)=*ptr1; + } + *(ptr2)=0; + } + } + } + } + } + ptr2=strchr(line,'='); + ptr2++; + entr->type=i; + if((i==TYP_TXTHTML) || (i==TYP_TEXTPAGE) || (i==TYP_TXTPLAIN)) + { + entr->pictype=i; + } + entr->entry=strdup(ptr2); + entr->headerpos=pos; + m->num_entrys++; + found=1; + } + } + } + } + return !found || (found && pfound); +} + +int Get_Menu(void) +{ +int rv=-1, loop=1, mlevel=0, clevel=0, pos=0; +char *pt1; +FILE *fh; + + Clear_List(&menu,1); + if((fh=fopen(TCF_FILE,"r"))!=NULL) + { + loop=1; + while((loop==1) && fgets(line_buffer, BUFSIZE, fh)) + { + TrimString(line_buffer); + pt1=strstr(line_buffer,TYPESTR[TYP_MENU]); + if(pt1 && (pt1==line_buffer)) + { + if(pos==menu.act_header) + { + clevel=menu.headerlevels[pos]; + loop=0; + } + mlevel++; + pos++; + } + else + { + pt1=strstr(line_buffer,TYPESTR[TYP_ENDMENU]); + if(pt1 && (pt1==line_buffer)) + { + mlevel--; + } + } + } + if(loop) + { + return rv; + } + + --pos; + --mlevel; + loop=1; + while((loop==1) && fgets(line_buffer, BUFSIZE, fh)) + { + TrimString(line_buffer); + pt1=strstr(line_buffer,TYPESTR[TYP_MENU]); + if(pt1 && (pt1==line_buffer)) + { + pos++; + if(mlevel==clevel) + { + AddListEntry(&menu, line_buffer, pos); + rv=0; + } + mlevel++; + } + pt1=strstr(line_buffer,TYPESTR[TYP_ENDMENU]); + if(pt1 && (pt1==line_buffer)) + { + mlevel--; + } + else + { + if(mlevel==clevel) + { + AddListEntry(&menu, line_buffer, pos); + rv=0; + } + } + if(mlevelact_entry,tind=m->act_entry, sbw=(m->num_entrys>10)?14:0; + char tstr[BUFSIZE], *tptr; + int moffs=35, ixw=400, iyw=(m->num_entrys<10)?((m->num_entrys+1)*30+moffs):375, dy, my, mh=iyw-moffs-radius-8, toffs, soffs=4, isx, isy; + dy=(m->num_entrys<10)?30:(mh/11); + toffs=dy/2; + my=moffs+dy+toffs; + + Center_Screen(ixw, iyw, &isx, &isy); + + tind=index; + + //frame layout + RenderBox(isx, isy, ixw, iyw, radius, CMC); +// RenderBox(0, 0, ixw, iyw, GRID, CMCS); + + // titlebar + RenderBox(isx+2, isy+2, ixw-2, moffs+5, radius, CMH); + + //selectbar + RenderBox(isx+2, isy+moffs+toffs+soffs+(index%10)*dy+2, ixw-sbw-2, dy+2, radius, CMCS); + + + if(sbw) + { + //sliderframe + RenderBox(isx+ixw-sbw, isy+moffs+8, sbw, mh, radius, CMCP1); + //slider + scrollbar_len = (double)mh / (double)((m->num_entrys/LIST_STEP+1)*LIST_STEP); + scrollbar_ofs = scrollbar_len*(double)((index/LIST_STEP)*LIST_STEP); + scrollbar_cor = scrollbar_len*(double)LIST_STEP; + RenderBox(isx+ixw-sbw, isy+moffs + scrollbar_ofs+8, sbw, scrollbar_cor , radius, CMCP3); + } + + // Title text + RenderString(m->headertxt[m->act_header], isx+45, isy+dy-soffs+3, ixw-sbw, LEFT, FSIZE_BIG, CMHT); + + index /= 10; + //Show table of commands + for(loop = index*10; (loop < (index+1)*10) && (loop < m->num_entrys); ++loop) + { + strcpy(tstr,m->list[loop]->entry); + if((tptr=strchr(tstr,','))!=NULL) + { + *tptr=0; + } + RenderString(tstr, isx+45, isy+my, ixw-sbw-65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); + if(m->list[loop]->type==TYP_MENU) + { + RenderString(">", isx+30, isy+my, 65, LEFT, FSIZE_MED, ((loop%10) == (tind%10))?CMCST:CMCT); + } + if(m->list[loop]->underline) + { + RenderBox(isx+10, isy+my+soffs+2, ixw-10-sbw, my+soffs+2, 0, CMCP3); + RenderBox(isx+10, isy+my+soffs+3, ixw-10-sbw, my+soffs+3, 0, CMCP1); + } + + switch(loop % 10) + { + case 0: RenderCircle(isx+9,isy+my-15,RED); break; + case 1: RenderCircle(isx+9,isy+my-15,GREEN); break; + case 2: RenderCircle(isx+9,isy+my-15,YELLOW); break; + case 3: RenderCircle(isx+9,isy+my-15,BLUE0); break; +/* + case 0: PaintIcon("/share/tuxbox/neutrino/icons/rot.raw",9,my-17,1); break; + case 1: PaintIcon("/share/tuxbox/neutrino/icons/gruen.raw",9,my-17,1); break; + case 2: PaintIcon("/share/tuxbox/neutrino/icons/gelb.raw",9,my-17,1); break; + case 3: PaintIcon("/share/tuxbox/neutrino/icons/blau.raw",9,my-17,1); break; +*/ + default: + sprintf(tstr,"%1d",(loop % 10)-3); + RenderString(tstr, isx+10, isy+my-1, 15, CENTER, FSIZE_SMALL, ((loop%10) == (tind%10))?CMCST:CMCT); + break; + + } + my += dy; + } + //copy backbuffer to framebuffer + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); +} + + +/* Parse City-Code from Entry + */ + +static int prs_get_city(void) +{ +char *tptr; +int cpos; +int res; +int len; + + len=strlen(menu.list[menu.act_entry]->entry); + + if ((tptr=strchr(menu.list[menu.act_entry]->entry,','))!=NULL) + { + ShowInfo(&menu); + if(!cmdline) + { + ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); + } + cpos=(tptr-menu.list[menu.act_entry]->entry); + strncpy(city_code,++tptr,len-cpos-1); + strncpy(city_name,menu.list[menu.act_entry]->entry,cpos); + city_name[cpos]=0; + city_code[len-cpos-1]=0; + printf("Tuxwetter \n",city_code); + if((res=parser(city_code,CONVERT_LIST,metric,intype,ctmo))!=0) + { + ShowMessage((res==-1)?prs_translate("keine Daten vom Wetterserver erhalten!",CONVERT_LIST):prs_translate("Datei convert.list nicht gefunden",CONVERT_LIST),1); + city_code[0]=0; + return 1; + } + } + else + { + ShowMessage(prs_translate("Ungültige Daten aus tuxwetter.conf",CONVERT_LIST),1); + city_code[0]=0; + return 1; + } + + return 0; +} + +void clear_screen(void) +{ +// for(; sy <= ey; sy++) memset(lbb + sx + var_screeninfo.xres*(sy),TRANSP, ex-sx + 1); + memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); +} + + + +void show_data(int index) +{ +#ifndef WWEATHER + char *pt1 = NULL; + int itmp; +#endif + +char vstr[512],v2str[512],rstr[512],tstr[512],icon[60]; +int vy=70,col1=40,col2=340; + +int wxw=ex-sx-10; //box width +int wyw=ey-sy; //box height +int gys=vy; //table space top +int gysf=34; //table space bottom +int gxs=40; //table space left +int gxw=((wxw-(gxs*2))/5) * 5; //table width +int gywf=100; //table footer height +int gyw=wyw-vy-gywf-gysf; //table height +int gicw=gxw/5; //table data width +int dy=26; //linespace +int vxs=0,wsx,wsy; +int tret=0; +int prelate=0; +int rcd; +int HMED=22; +int slim=0; //using 720x576 +time_t atime; +struct tm *sltime; +char tun[2]="C",sun[5]="km/h",dun[3]="km",pun[5]="mbar",cun[20]; + + if(var_screeninfo.xres < 800) + slim=1; + + clear_screen(); + + Center_Screen(wxw, wyw, &wsx, &wsy); + gxs+=wsx; + gys+=wsy; + gyw+=wsy; + col1+=wsx; + col2+=wsx; + vy+=wsy; + + //frame layout + if(index!=1) + { + RenderBox(wsx, wsy, wxw, wyw, radius, CMC); + RenderBox(wsx+2, wsy+2, wxw-2, 44, radius, CMH); + } + else + { + if(!cmdline) + { + ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); + } + } + + strcpy(cun,prs_translate("Uhr",CONVERT_LIST)); + if(!metric) + { + sprintf(tun,"F"); + sprintf(sun,"mph"); + sprintf(dun,"mi"); + sprintf(pun,"in"); + *cun=0; + } + if(index==-99) + { + int i; + unsigned char grstr[XL+1]={'G'^XX,'r'^XX,'\xFC'^XX,'\xDF'^XX,'e'^XX,' '^XX,'v'^XX,'o'^XX,'m'^XX,' '^XX,'N'^XX,'e'^XX,'w'^XX,'-'^XX,'T'^XX,'u'^XX,'x'^XX,'w'^XX,'e'^XX,'t'^XX,'t'^XX,'e'^XX,'r'^XX,'-'^XX,'T'^XX,'e'^XX,'a'^XX,'m'^XX,'!'^XX,' '^XX,' '^XX,';'^XX,'-'^XX,')'^XX,' '^XX,' '^XX,'w'^XX,'w'^XX,'w'^XX,'.'^XX,'k'^XX,'e'^XX,'y'^XX,'w'^XX,'e'^XX,'l'^XX,'t'^XX,'-'^XX,'b'^XX,'o'^XX,'a'^XX,'r'^XX,'d'^XX,'.'^XX,'c'^XX,'o'^XX,'m'^XX,0}; + + sprintf(rstr,"CS-Tuxwetter Version %s",P_VERSION); + RenderString(rstr, 0, 34, wxw, CENTER, FSIZE_BIG, CMHT); + + sprintf(rstr,"%s",prs_translate("Steuertasten in den Menüs",CONVERT_LIST)); + RenderString(rstr, 0, vy, wxw, CENTER, HMED, GREEN); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Farbtasten Rot, Grün, Gelb, Blau",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Direktanwahl Funktionen 1-4",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Zifferntasten 1-6",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Direktanwahl Funktionen 5-10",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Hoch",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("vorheriger Menüeintrag",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("nächster Menüeintrag",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("PgDown (bei mehrseitigen Menüs)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("eine Seite vorblättern",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("PgUp (bei mehrseitigen Menüs)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("eine Seite zurückblättern",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("OK",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Menüpunkt ausführen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Home",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("zurück zum vorigen Menü",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("MENU-Taste (im Hauptmenü)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("fehlende Übersetzungen anzeigen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Standby-Taste",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("CS-Tuxwetter beenden",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=(1.5*(double)dy); + + sprintf(rstr,"%s",prs_translate("Steuertasten in Datenanzeige",CONVERT_LIST)); + RenderString(rstr, 0, vy, wxw, CENTER, HMED, GREEN); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Hoch",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("vorherigen Eintrag anzeigen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Runter",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("nächsten Eintrag anzeigen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; +/* + sprintf(rstr,"%s",prs_translate("Links (in Bildanzeige)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("neu downloaden (für WebCams)",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Rechts (bei Ani-GIF's)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Animation wiederholen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; +*/ + sprintf(rstr,"%s",prs_translate("Rot (in fehlenden Übersetzungen)",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Fehlliste löschen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("OK / Home",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, HMED, CMCT); + sprintf(rstr,"%s",prs_translate("Aktuelle Anzeige schließen",CONVERT_LIST)); + RenderString(rstr, col2, vy, wxw-col2, LEFT, HMED, CMCT); + vy+=(1.5*(double)dy); + + for(i=0; i<(XL-1); i++) + { + grstr[i]^=XX; + } + RenderString(grstr, 0, vy, wxw, CENTER, HMED, CMHT); + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + rcd=GetRCCode(); + while((rcd != KEY_OK) && (rcd != KEY_EXIT)) + { + rcd=GetRCCode(); + } + } + else + { + if(index==1) + { + int i, tmax[7], tmin[7], mint=100, maxt=-100, j, pmin, pmax; + double tstep=1, garr[70], tv1, tv2, tv3; + + RenderBox(wsx, wsy, wxw, wyw, radius, CMC); + RenderBox(wsx, wsy, wxw, 44, radius, CMH); + sprintf(rstr,"%s",prs_translate("Trend für die kommende Woche",CONVERT_LIST)); + RenderString(rstr, wsx, wsy+34, wxw, CENTER, FSIZE_BIG, CMHT); + RenderLine(gxs,gys,gxs,gys+gyw+gywf,CMCIT); + RenderLine(gxs+1,gys,gxs+1,gys+gyw+gywf,CMCIT); + for(i=0; i<5; i++) + { + prs_get_val(i, PRE_TEMPH,0,vstr); + if(sscanf(vstr,"%d",&tmax[i])!=1) + { + if(!i) + { + vxs=1; + tmax[i]=0; + } + else + { + tmax[i]=tmax[i-1]; + } + } + prs_get_val(i, PRE_TEMPL,0,vstr); + if(sscanf(vstr,"%d",&tmin[i])!=1) + { + tmin[i]=(i)?tmin[i-1]:0; + } + if(tmin[i]maxt) + { + maxt=tmax[i]; + } + if(tmin[i]>maxt) + { + maxt=tmin[i]; + } + if(!show_icons) + { +#ifdef WWEATHER + prs_get_dwday(i, PRE_DAY,vstr); + strcat(vstr,"_SIG"); +#else + prs_get_day(i, vstr, metric); + if((pt1=strchr(vstr,','))!=NULL) + { + strcpy(pt1,"_SIG"); + } +#endif + strcpy(rstr,prs_translate(vstr,CONVERT_LIST)); + RenderString(rstr, gxs+i*gicw, gys+gyw+(FSIZE_BIG/2+gywf/2), gicw, CENTER, FSIZE_BIG, CMCT);//weekday + } + RenderLine(gxs+(i+1)*gicw,gys,gxs+(i+1)*gicw,gys+gyw+gywf,CMCIT); + } + RenderLine(gxs+i*gicw+1,gys,gxs+i*gicw+1,gys+gyw+gywf,CMCIT); + tstep=(5*(1+(int)((maxt-mint)/5))+1); + tstep=(double)(gyw-5)/tstep; + + RenderLine(gxs,gys,gxs,gys+gyw,CMCIT); + RenderLine(gxs+1,gys,gxs+1,gys+gyw,CMCIT); + RenderLine(gxs+2,gys,gxs+2,gys+gyw,CMCIT); + RenderLine(gxs,gys+gyw,gxs+gxw,gys+gyw,CMCIT); + RenderLine(gxs,gys+gyw+1,gxs+gxw,gys+gyw+1,CMCIT); + RenderLine(gxs,gys+gyw+2,gxs+gxw,gys+gyw+2,CMCIT); + RenderLine(gxs,gys+gyw+gywf,gxs+gxw,gys+gyw+gywf,CMCIT); + RenderLine(gxs,gys+gyw+gywf+1,gxs+gxw,gys+gyw+gywf+1,CMCIT); + RenderString(prs_translate("Höchstwerte",CONVERT_LIST), gxs, gys, gxw/2, CENTER, FSIZE_SMALL, YELLOW); + RenderString(prs_translate("Tiefstwerte",CONVERT_LIST), gxs+(gxw/2), gys, gxw/2, CENTER, FSIZE_SMALL, GREEN); + + for(i=1; i<=(5*(1+(int)((maxt-mint)/5))+1); i++) + { + if(i) + { +// RenderLine(gxs,gys+gyw-(i*tstep)-1,gxs+gxw,gys+gyw-(i*tstep)-1,((!(mint+i-1)))?CMCT:CMCIT); + RenderLine(gxs,gys+gyw-(i*tstep)-2,gxs+gxw,gys+gyw-(i*tstep)-2,((!(mint+i-1)))?CMCT:CMCIT); + if(!((mint+i-1)%5)) + { + RenderLine(gxs,gys+gyw-(i*tstep)-3,gxs+gxw,gys+gyw-(i*tstep)-3,((!(mint+i-1)))?CMCT:CMCIT); + } + RenderLine(gxs,gys+gyw-(i*tstep)-1,gxs+gxw,gys+gyw-(i*tstep)-1,CMCP3); + } + sprintf(vstr,"%d",mint+i-1); + RenderString(vstr,gxs-35,gys+gyw-(i*tstep)+7, 30, RIGHT, FSIZE_VSMALL, CMCT); + RenderString(vstr,gxs+gxw+2,gys+gyw-(i*tstep)+7, 30, RIGHT, FSIZE_VSMALL, CMCT); + } + RenderLine(gxs,gys+gyw-((i-1)*tstep)-3,gxs+gxw,gys+gyw-((i-1)*tstep)-3,((!(mint+i-1)))?CMCT:CMCIT); + +// Geglättete Kurven + + for(i=0; i<5; i++) + { + tv1=tmin[i]; + tv2=tmin[i+1]; + for(j=0; j<10; j++) + { + tv3=j-2; + if(j<2) + { + garr[i*10+j]=tv1; + } + else + { + if(j>7) + { + garr[i*10+j]=tv2; + } + else + { + garr[i*10+j]=((tv1*(6.0-tv3))+(tv2*tv3))/6.0; + } + } + } + } + for(i=2; i<39; i++) + { + garr[i]=(garr[i-2]+garr[i-1]+garr[i]+garr[i+1]+garr[i+2])/5.0; + } + for(i=1; i<=40; i++) + { + pmin=(gys+gyw)-(garr[i-1]-mint+1)*tstep-1; + pmax=(gys+gyw)-(garr[i]-mint+1)*tstep-1; + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin,gxs+gicw/2+i*(gicw/10),pmax,GREEN); + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+1,gxs+gicw/2+i*(gicw/10),pmax+1,GREEN); + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+2,gxs+gicw/2+i*(gicw/10),pmax+2,GREEN); + } + for(i=vxs; i<5; i++) + { + tv1=tmax[i]; + tv2=tmax[i+1]; + for(j=0; j<10; j++) + { + tv3=j-2; + if(j<2) + { + garr[i*10+j]=tv1; + } + else + { + if(j>7) + { + garr[i*10+j]=tv2; + } + else + { + garr[i*10+j]=((tv1*(6.0-tv3))+(tv2*tv3))/6.0; + } + } + } + } + for(i=2+10*vxs; i<39; i++) + { + garr[i]=(garr[i-2]+garr[i-1]+garr[i]+garr[i+1]+garr[i+2])/5.0; + } + for(i=1+10*vxs; i<=40; i++) + { + pmin=(gys+gyw)-(garr[i-1]-mint+1)*tstep-1; + pmax=(gys+gyw)-(garr[i]-mint+1)*tstep-1; + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin,gxs+gicw/2+i*(gicw/10),pmax,YELLOW); + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+1,gxs+gicw/2+i*(gicw/10),pmax+1,YELLOW); + RenderLine(gxs+gicw/2+((i-1)*(gicw/10)),pmin+2,gxs+gicw/2+i*(gicw/10),pmax+2,YELLOW); + } + +// Ungeglättete Kurven +/* + for(i=1; i<7; i++) + { + { + pmin=(gys+gyw)-(tmin[i-1]-mint+1)*tstep-1; + pmax=(gys+gyw)-(tmin[i]-mint+1)*tstep-1; + RenderLine(gxs+gicw/2+gicw*(i-1),pmin,gxs+gicw/2+gicw*i,pmax,GREEN); + RenderLine(gxs+gicw/2+gicw*(i-1),pmin+1,gxs+gicw/2+gicw*i,pmax+1,GREEN); + pmin=(gys+gyw)-(tmax[i-1]-mint+1)*tstep-1; + pmax=(gys+gyw)-(tmax[i]-mint+1)*tstep-1; + RenderLine(gxs+gicw/2+gicw*(i-1),pmin,gxs+gicw/2+gicw*i,pmax,YELLOW); + RenderLine(gxs+gicw/2+gicw*(i-1),pmin+1,gxs+gicw/2+gicw*i,pmax+1,YELLOW); + } + } +*/ + +// memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); + + if(show_icons) + { + for(i=0; i<5; i++) + { + prs_get_val(i,PRE_ICON,prelate,vstr); +#ifdef WWEATHER + if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) == 0) +#else + sprintf (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr); + if (HTTP_downloadFile(icon, ICON_FILE, 0, intype, ctmo, 2) == 0) +#endif + { + int picx=80,picy=80; + tret=pic_on_data(icon,sx+gxs+(i*gicw)+((gicw/2)-(picx/2)),sy+gys+gyw+((gywf/2)-(picy/2)), picx, picy, 5, (i)?((i==4)?1:0):2, 0, 0); + } + prs_get_dwday(i, PRE_DAY,vstr); + strcat(vstr,"_SIG"); + strcpy(rstr,prs_translate(vstr,CONVERT_LIST)); + RenderString(rstr, gxs+(i*gicw+17), gys+gyw+FSIZE_BIG+5, gicw, LEFT, FSIZE_BIG,CMCT );//weekday + } + } + + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + else + { + if(index==0) + { + dy=24; + vy-=2; + + // show icon + prs_get_val(0, ACT_ICON, 0, vstr); +#if 0 + sprintf (rstr,"%s.bmp",vstr); + bmp2lcd (rstr); +#endif + if(show_icons) + { + xremove(ICON_FILE); +#ifdef WWEATHER + if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) != 0) +#else + sprintf (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr); + if (HTTP_downloadFile(icon, ICON_FILE, 0, intype, ctmo, 2) != 0) +#endif + { + printf("Tuxwetter \n"); + } + } + + sprintf(rstr,"%s",prs_translate("Aktuelles Wetter",CONVERT_LIST)); + RenderString(rstr, 0, 34, wxw, CENTER, FSIZE_BIG, CMHT); + + sprintf(rstr,"%s",prs_translate("Standort:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN); +#ifdef WWEATHER + prs_get_val(0, ACT_CITY, 0, vstr); + RenderString(vstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); +#else + sprintf(rstr,"%s",city_name); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); +#endif + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Längengrad:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_dbl(0, ACT_LON, 0, vstr); + sprintf(rstr,"%s",vstr); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Breitengrad:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_dbl(0, ACT_LAT, 0, vstr); + sprintf(rstr,"%s",vstr); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Ortszeit:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +#ifdef WWEATHER + sprintf(rstr,"---"); +#else + prs_get_time(0, ACT_TIME, vstr, metric); + sprintf(rstr,"%s %s",vstr,cun); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Aktuelle Uhrzeit:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +// prs_get_time(0, ACT_TIME, vstr); + time(&atime); + sltime=localtime(&atime); + if(metric) + { + sprintf(rstr,"%02d:%02d %s",sltime->tm_hour,sltime->tm_min,cun); + } + else + { + sprintf(rstr,"%02d:%02d %s",(sltime->tm_hour)?((sltime->tm_hour>12)?sltime->tm_hour-12:sltime->tm_hour):12,sltime->tm_min,(sltime->tm_hour>=12)?"PM":"AM"); + } + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Zeitpunkt der Messung:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +#ifdef WWEATHER + prs_get_time(0, ACT_UPTIME, vstr, metric); +#else + prs_get_dtime(0, ACT_UPTIME, vstr, metric); +#endif + sprintf(rstr,"%s %s",vstr,cun); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=(1.5*(double)dy); + + sprintf(rstr,"%s",prs_translate("Bedingung:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, GREEN); + prs_get_val(0, ACT_COND, 0, vstr); + sprintf(rstr,"%s",vstr); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Temperatur:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_TEMP, 0, vstr); +#ifdef WWEATHER + sprintf(rstr,"%s °%s",vstr,tun); +#else + prs_get_val(0, ACT_FTEMP, 0, v2str); + sprintf(rstr,"%s °%s %s %s °%s",vstr,tun,prs_translate("gefühlt:",CONVERT_LIST),v2str,tun); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Luftfeuchtigkeit:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_HMID, 0, vstr); + sprintf(rstr,"%s %%",vstr); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Taupunkt:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +#ifdef WWEATHER + sprintf(rstr,"---"); +#else + prs_get_val(0, ACT_DEWP, 0, vstr); + sprintf(rstr,"%s °%s",vstr,tun); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Luftdruck:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_PRESS, 0, vstr); +#ifdef WWEATHER + RenderString(vstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); +#else + prs_get_val(0, ACT_PRTEND, 0, v2str); + sprintf(rstr,"%s %s %s",vstr,pun,v2str); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); +#endif + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Wind:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_WINDD, 0, vstr); + prs_get_val(0, ACT_WSPEED, 0, v2str); + if((strstr(vstr,"windstill")!=NULL) || (strstr(v2str,"CALM")!=NULL)) + { + sprintf(rstr,"%s",prs_translate("windstill",CONVERT_LIST)); + } + else + { + sprintf(tstr,"%s",prs_translate("von",CONVERT_LIST)); + sprintf(rstr,"%s %s %s %s %s",tstr,vstr,prs_translate("mit",CONVERT_LIST),v2str,sun); + } + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=(1.5*(double)dy); + + sprintf(rstr,"%s",prs_translate("Sonnenaufgang:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +#ifdef WWEATHER + sprintf(rstr,"---"); +#else + prs_get_time(0, ACT_SUNR, vstr,metric); + sprintf(rstr,"%s %s",vstr,cun); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Sonnenuntergang:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); +#ifdef WWEATHER + sprintf(rstr,"---"); +#else + prs_get_time(0, ACT_SUNS, vstr,metric); + sprintf(rstr,"%s %s",vstr,cun); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; +#ifdef WWEATHER + sprintf(rstr,"%s",prs_translate("Bewölkung:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_CLOUDC, 0, v2str); + sprintf(rstr,"%s %%",v2str); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; +#else + sprintf(rstr,"%s",prs_translate("Mondphase:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_MOON, 0, v2str); + sprintf(rstr,"%s",v2str); + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; +#endif + sprintf(rstr,"%s",prs_translate("Fernsicht:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_VIS, 0, vstr); +#ifdef WWEATHER + sprintf(rstr,"%s %s",vstr,dun); +#else + if(sscanf(vstr,"%d",&itmp)==1) + { + sprintf(rstr,"%s %s",vstr,dun); + } + else + { + strcpy(rstr,vstr); + } +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; +#ifdef WWEATHER + sprintf(rstr,"%s",prs_translate("Niederschlag:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, ACT_PRECIPMM, 0, vstr); + sprintf(rstr,"%s mm",vstr); +#else + sprintf(rstr,"%s",prs_translate("UV-Index:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + + prs_get_val(0, ACT_UVIND, 0, vstr); + prs_get_val(0, ACT_UVTEXT, 0, v2str); + sprintf(rstr,"%s %s",vstr,v2str); + + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + + sprintf(rstr,"%s",prs_translate("Regenrisiko:",CONVERT_LIST)); + RenderString(rstr, col1, vy, col2-col1, LEFT, FSIZE_MED, CMCT); + prs_get_val(0, PRE_PPCP, 0, vstr); + sprintf(rstr,"%s %%",vstr); +#endif + RenderString(rstr, col2, vy, wxw-col2, LEFT, FSIZE_MED, CMCT); + vy+=dy; + +// memcpy(lfb, lbb, var_screeninfo.xres*var_screeninfo.yres); + + if(show_icons) + { + //tret=pic_on_data(icon, 540, 115, 100, 100, 5, 3, 0, 0); + if(!slim) + tret=pic_on_data(icon,700, 115, 100, 100, 5, 3, 0, 0); + else + tret=pic_on_data(icon,540, 115, 80, 80, 5, 3, 0, 0); + } + + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + else + { + --index; + if(index==1) + { + prs_get_val(index-1, PRE_TEMPH, 0, vstr); + if(strstr(vstr,"N/A")!=NULL) + { + prelate=1; + } + } + + + // show icon + prs_get_val(index-1,PRE_ICON,prelate,vstr); +#if 0 + sprintf (rstr,"%s.bmp",vstr); + bmp2lcd (rstr); +#endif + if(show_icons) + { + xremove(ICON_FILE); +#ifdef WWEATHER + if (HTTP_downloadFile(vstr, ICON_FILE, 0, intype, ctmo, 2) != 0) +#else + sprintf (icon,"http://image.weather.com/web/common/intlwxicons/52/%s.gif",vstr); + if (HTTP_downloadFile(icon, ICON_FILE,0,intype,ctmo,2) != 0) +#endif + { + printf("Tuxwetter (ex-xstart)) txsize= (ex-xstart); + else txsize= xsize; + if (ysize > (ey-ystart)) tysize= (ey-ystart); + else tysize=ysize; + xfact= 1000*txsize/x1; + xfact= xfact/1000; + yfact= 1000*tysize/y1; + yfact= yfact/1000; + + if ( xfact <= yfact) + { + *imx=(int)x1*xfact; + *imy=(int)y1*xfact; + if (center !=0) + { + tystart=(ey-sy)-*imy; + tystart=tystart/2; + tystart=tystart+ystart; + } + } + else + { + *imx=(int)x1*yfact; + *imy=(int)y1*yfact; + if (center !=0) + { + txstart=(ex-sx)-*imx; + txstart=txstart/2; + txstart=txstart+xstart; + } + } + tempx=*imx; + tempy=*imy; + *buffer=(char*)color_average_resize(*buffer,x1,y1,*imx,*imy); + + *dxp=0; + *dyp=0; + *dxo=txstart; + *dyo=tystart; +} + +void close_jpg_gif_png(void) +{ +#if 0 + // clear Display + fb_set_gmode(0); +// memcpy(&otr,&rtr,256); + ioctl(fb, FBIOPUTCMAP, oldcmap); +// for(; sy <= ey; sy++) memset(lbb + sx + var_screeninfo.xres*(sy),TRANSP, ex-sx + 1); + memset(lbb, TRANSP, var_screeninfo.xres*var_screeninfo.yres); + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + gmodeon=0; +#endif +} + +int wait_image(int repeat, int first) +{ +time_t t1,t2; +int rv; + + if(!repeat) + { + rv=GetRCCode(); + return rv; + } + time(&t1); + t2=t1; + while((t2-t1)\n"); + return -1; + } + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) + { + printf(NOMEM); + return -1; + } + if(!(rv=fh_jpeg_load(name, buffer, x1, y1))) + { + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + //fb_set_gmode(1); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1); + gmodeon=1; + } + free(buffer); + + if(!rv && wait) + { + rcj=wait_image(repeat, 1); + while((rcj != KEY_OK) && (rcj != KEY_EXIT) && (rcj != KEY_DOWN) && (rcj != KEY_LEFT) && (rcj != KEY_UP) && (rcj != KEY_VOLUMEUP) && (rcj != KEY_VOLUMEDOWN)) + { + rcj=wait_image(repeat, 0); + } + if(single || (rcj==KEY_OK) || (rcj==KEY_EXIT)) + { + close_jpg_gif_png(); + } + else + { + showBusy(startx+3,starty+3,10,0xff,00,00); +// showBusy(startx+10,starty+10,20,170,0,0); + if(rcj==KEY_EXIT) + { + rcj=KEY_OK; + } + return rcj; + } + } + } + + return (rv)?-1:0; +} + +int show_png(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int repeat, int single, int center) +{ +FILE *tfh; +int x1,y1,rcn,rv=-1; +int imx,imy,dxo,dyo,dxp,dyp; +unsigned char *buffer=NULL; + + if((tfh=fopen(name,"r"))!=NULL) + { + fclose(tfh); + if(fh_png_getsize(name, &x1, &y1, xsize, ysize)) + { + printf("Tuxwetter \n"); + return -1; + } + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) + { + printf(NOMEM); + return -1; + } + if(!(rv=fh_png_load(name, buffer, x1, y1))) + { + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + fb_set_gmode(1); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1); + gmodeon=1; + } + free(buffer); + + if(!rv && wait) + { + rcn=wait_image(repeat, 1); + while((rcn != KEY_OK) && (rcn != KEY_EXIT) && (rcn != KEY_DOWN) && (rcn != KEY_LEFT) && (rcn != KEY_UP) && (rcn != KEY_VOLUMEUP) && (rcn != KEY_VOLUMEDOWN)) + { + rcn=wait_image(repeat, 0); + } + if(single || (rcn==KEY_OK) || (rcn==KEY_EXIT)) + { + close_jpg_gif_png(); + } + else + { + showBusy(startx+3,starty+3,10,0xff,00,00); +// showBusy(startx+10,starty+10,20,170,0,0); + if(rcn==KEY_EXIT) + { + rcn=KEY_OK; + } + return rcn; + } + } + } + + return (rv)?-1:0; +} + +static int gifs=0; + +int show_gif(char *name, int xstart, int ystart, int xsize, int ysize, int wait, int repeat, int single, int center, int nodecomp) +{ +FILE *tfh; +int x1,y1,rcg,count,cloop,rv=-1; +int imx,imy,dxo,dyo,dxp,dyp; +char *buffer=NULL, fname[512]; + + if((tfh=fopen(name,"r"))!=NULL) + { + fclose(tfh); + if(nodecomp) + { + count=gifs; + } + else + { + xremove("/tmp/tempgif.gif"); + gifs=count=gifdecomp(GIF_FILE, GIF_MFILE); + } + if(count<1) + { + printf("Tuxwetter \n"); + return -1; + } + cloop=0; + while(count--) + { + sprintf(fname,"%s%02d.gif",GIF_MFILE,cloop++); + if(fh_gif_getsize(fname, &x1, &y1, xsize, ysize)) + { + printf("Tuxwetter \n"); + return -1; + } + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) + { + printf(NOMEM); + return -1; + } + if(!(rv=fh_gif_load(fname, buffer, x1, y1))) + { + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + fb_set_gmode(1); + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 1, 1); + gmodeon=1; + + if(gifs>1) + { + sprintf(fname,"%s %2d / %d", prs_translate("Bild",CONVERT_LIST),cloop, gifs); +// LCD_draw_string(13, 9, fname); +// LCD_update(); + } + } + free(buffer); + } + + if(!rv && wait) + { + rcg=wait_image(repeat, 1); + while((rcg != KEY_OK) && (rcg != KEY_EXIT) && (rcg != KEY_DOWN) && (rcg != KEY_UP) && (rcg != KEY_VOLUMEUP) && (rcg != KEY_VOLUMEDOWN)&& (rcg != KEY_LEFT) && (rcg != KEY_RIGHT)) + { + rcg=wait_image(repeat, 0); + } + if(single || (rcg==KEY_OK) || (rcg==KEY_EXIT)) + { + close_jpg_gif_png(); + } + else + { + showBusy(startx+3,starty+3,10,0xff,00,00); +// showBusy(startx+10,starty+10,20,170,0,0); + if(rcg==KEY_EXIT) + { + rcg=KEY_OK; + } + return rcg; + } + } + } + + return (rv)?-1:0; +} + +int pic_on_data(char *url, int xstart, int ystart, int xsize, int ysize, int wait, int single, int center, int rahmen) +{ +FILE *tfh; +int /*i,*/x1,y1,rv=-1; + +int imx,imy,dxo,dyo,dxp,dyp; +unsigned char *buffer=NULL/*,*gbuf*/; +unsigned char *tbuf=lfb; + + if((tfh=fopen(ICON_FILE,"r"))!=NULL) + { + lfb=lbb; +#ifdef WWEATHER + if(fh_png_getsize(ICON_FILE, &x1, &y1, xsize, ysize)) + { + printf("Tuxwetter \n"); + return -1; + } +#else + if(fh_gif_getsize(ICON_FILE, &x1, &y1, xsize, ysize)) + { + printf("Tuxwetter \n"); + return -1; + } +#endif + if((buffer=(unsigned char *) malloc(x1*y1*4))==NULL) + { + printf(NOMEM); + return -1; + } +#ifdef WWEATHER + if(!(rv=fh_png_load(ICON_FILE, buffer, x1, y1))) +#else + if(!(rv=fh_gif_load(ICON_FILE, buffer, x1, y1))) +#endif + { + scale_pic(&buffer,x1,y1,xstart,ystart,xsize,ysize,&imx,&imy,&dxp,&dyp,&dxo,&dyo,center); + if (rahmen >0) + { + RenderBox(xstart+1-sx-rahmen, ystart-6-sy-rahmen,xstart+xsize+2-sx+rahmen,ystart+ysize-sy-6+rahmen, 0, CMCS); +// memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + + if(single & 2) + { + single &= ~2; +#if 0 +// don't know what this is about +#ifndef HAVE_DREAMBOX_HARDWARE + i=fix_screeninfo.line_length*var_screeninfo.yres; + gbuf=lfb; + while(i--) + if(*gbuf >=127) + *(gbuf++)-=127; + else + *(gbuf++)=11; +#endif +#endif + } + + fb_display(buffer, imx, imy, dxp, dyp, dxo, dyo, 0, single); +#if 0 +// don't know what this is about + if(single & 1) + { + ioctl(fb, FBIOPUTCMAP, &spcmap); + } +#endif + gmodeon=1; + + } + free(buffer); + lfb=tbuf; + } + return (rv)?-1:0; +} + +int show_php(char *name, char *title, int plain, int highlite) +{ +FILE *tfh; +int x1,y1,cs,rcp,rv=-1,run=1,line=0,action=1,cut; +int col1,sy=0,dy=26,psx,psy,pxw=/*620*/ex-sx,pyw=/*510*/ey-sy; + + Center_Screen(pxw,pyw,&psx,&psy); + col1=psx+40; + sy=psy+70; + if((tfh=fopen(name,"r"))!=NULL) + { +/* if(gmodeon) + { + close_jpg_gif_png(); + } +*/ fclose(tfh); + + RenderString("X", psx+pxw/2, psy+pyw/2, 100, LEFT, FSIZE_SMALL, CMCT); + if(fh_php_getsize(name, plain, &x1, &y1)) + { + printf("Tuxwetter \n"); + return -1; + } + cs=FSIZE_MED*((double)(pxw-1.5*(double)(col1-psx))/(double)x1); + if(cs>FSIZE_MED) + { + cs=FSIZE_MED; + } + + dy=1.2*(double)cs; + + while(run) + { + //frame layout + if(action) + { + RenderBox(psx, psy, pxw, pyw, radius, CMC); + RenderBox(psx+2, psy+2, pxw-4, 44, radius, CMH); + RenderString(title, psx, psy+34, pxw, CENTER, FSIZE_BIG, CMHT); + + if(!(rv=fh_php_load(name, col1, sy, dy, cs, line, highlite, plain, &cut))) + { + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); + } + } + + if(!rv) + { + rcp=GetRCCode(); + while((rcp != KEY_OK) && (rcp != KEY_EXIT) && (rcp != KEY_PAGEUP) && (rcp != KEY_PAGEDOWN) && (rcp != KEY_DOWN) && (rcp != KEY_UP) && (rcp != KEY_VOLUMEUP) && (rcp != KEY_VOLUMEDOWN)&& (rcp != KEY_RED)) + { + rcp=GetRCCode(); + } + if(rcp==KEY_EXIT) + { + rcp=KEY_OK; + } + if((rcp != KEY_PAGEUP) && (rcp != KEY_PAGEDOWN)) + { + return rcp; + } + switch(rcp) + { + case KEY_PAGEDOWN: + if((action=cut)!=0) + { + line+=5; + } + break; + + case KEY_PAGEUP: + if(line) + { + if((line-=5)<0) + { + line=0; + } + action=1; + } + else + { + action=0; + } + break; + } + } + rv=0; + } + } + return (rv)?-1:0; +} + +char *translate_url(char *cmd, int ftype, int absolute) +{ +char *rptr=NULL,*pt1 = NULL,*pt2 = NULL,*pt3 = NULL,*pt4 = NULL,*pt5 = NULL; +char *sstr=strdup(cmd),*estr=strdup(cmd); +FILE *fh = NULL,*fh2 = NULL; +int txttype=(ftype==TYP_TXTHTML),crlf=0; +long flength = 0; + + + strcpy(trstr,cmd); + pt1=trstr; +// ++pt1; + if((pt2=strchr(pt1,'|'))!=NULL) + { + *pt2=0; + ++pt2; + if((pt3=strchr(pt2,'|'))!=NULL) + { + *pt3=0; + ++pt3; + printf("Tuxwetter \n",pt1); + if(!HTTP_downloadFile(pt1, TRANS_FILE, 1, intype, ctmo, 2)) + { + if((fh=fopen(TRANS_FILE,"r"))!=NULL) + { + fseek(fh,0,SEEK_END); + flength=ftell(fh); + rewind(fh); + if((htmstr=calloc(flength+1,sizeof(char)))!=NULL) + { + if(fread(htmstr,(size_t)flength,1,fh)>0) + { + *(htmstr+flength)=0; + if((pt4=strchr(htmstr,13))!=NULL) + { + crlf=(*(pt4+1)==10); + } + pt4=sstr; + while(*pt2) + { + if((*pt2=='\\') && (*(pt2+1)=='n')) + { + if(crlf) + { + *pt4=13; + pt4++; + } + pt2++; + *pt4=10; + } + else + { + *pt4=*pt2; + } + ++pt4; + ++pt2; + } + *pt4=0; + + pt4=estr; + while(*pt3) + { + if((*pt3=='\\') && (*(pt3+1)=='n')) + { + if(crlf) + { + *pt4=13; + pt4++; + } + pt3++; + *pt4=10; + } + else + { + *pt4=*pt3; + } + ++pt4; + ++pt3; + } + *pt4=0; + if((pt3=strstr(htmstr,sstr))!=NULL) + { + if((pt5=strstr(pt3+strlen(sstr)+1,estr))!=NULL) + { + do + { + pt4=pt3; + pt3++; + pt3=strstr(pt3,sstr); + } + while(pt3 && (pt3"); + + while(*pt4) + { + if(*pt4=='<') + { + dontsave=1; + } + if(*pt4=='>') + { + dontsave=2; + } + if(!dontsave) + { + if((*pt4==' ') && (flength>60)) + { + fprintf(fh2,"\n
"); + flength=0; + newline=1; + } + else + { + if(*pt4>' ' || newline<2) + { + if(*pt4>' ') + { + newline=0; + } + fputc(*pt4,fh2); + } + } + if(*pt4==10) + { + if(newline<2) + { + fprintf(fh2,"
"); + } + flength=0; + ++newline; + } + flength++; + } + if(dontsave==2) + { + dontsave=0; + } + pt4++; + } + fprintf(fh2,"\n

"); + fclose(fh2); + rptr=pt1; + } + } + } + } + } + free(htmstr); + } + fclose(fh); + } + } + } + } + + free(sstr); + free(estr); + + if(rptr) + { + pt1=rptr; + while(*pt1) + { + if(*pt1==' ') + { + *(pt1+strlen(pt1)+2)=0; + memmove(pt1+2,pt1,strlen(pt1)); + *pt1++='%'; + *pt1++='2'; + *pt1='0'; + } + pt1++; + } + } + + return rptr; +} + +int Menu_Up(MENU *m) +{ +int llev=m->headerlevels[m->act_header], lmen=m->act_header, lentr=m->lastheaderentrys[m->act_header]; + + while((lmen>=0) && (m->headerlevels[lmen]>=llev)) + { + --lmen; + } + if(lmen<0) + { + return 0; + } + m->act_header=lmen; + Get_Menu(); + m->act_entry=lentr; + + return 1; +} + +void read_neutrino_osd_conf(int *ex,int *sx,int *ey, int *sy) +{ + const char *filename="/var/tuxbox/config/neutrino.conf"; + const char spres[][5]={"","_crt","_lcd"}; + char sstr[4][32]; + int pres=-1, loop, *sptr[4]={ex, sx, ey, sy}; + char *buffer; + size_t len; + ssize_t read; + FILE* fd; + + fd = fopen(filename, "r"); + if(fd){ + buffer=NULL; + len = 0; + while ((read = getline(&buffer, &len, fd)) != -1){ + sscanf(buffer, "screen_preset=%d", &pres); + } + if(buffer) + free(buffer); + rewind(fd); + ++pres; + sprintf(sstr[0], "screen_EndX%s=%%d", spres[pres]); + sprintf(sstr[1], "screen_StartX%s=%%d", spres[pres]); + sprintf(sstr[2], "screen_EndY%s=%%d", spres[pres]); + sprintf(sstr[3], "screen_StartY%s=%%d", spres[pres]); + + buffer=NULL; + len = 0; + while ((read = getline(&buffer, &len, fd)) != -1){ + for(loop=0; loop<4; loop++) { + sscanf(buffer, sstr[loop], sptr[loop]); + } + } + fclose(fd); + if(buffer) + free(buffer); + } +} + +/****************************************************************************** + * Tuxwetter Main + ******************************************************************************/ + +int main (int argc, char **argv) +{ +int index=0,cindex=0,tv,rcm,rce,ferr=0,tret=-1; +int mainloop=1,wloop=1, dloop=1; +char rstr[BUFSIZE], *rptr; +char tstr[BUFSIZE]; +FILE *tfh; +LISTENTRY epl={NULL, 0, TYP_TXTPLAIN, TYP_TXTPLAIN, 0, 0, 0}; +PLISTENTRY pl=&epl; + + // if problem with config file return from plugin + + for(tv=1; tvtype==TYP_TXTHTML) || (pl->type==TYP_PICHTML)) + { + char *pt1=pl->entry, *pt2=nstr; + + strcpy(line_buffer,strchr(pt1,',')+1); + while(*pt1 && (*pt1 != ',')) + { + *pt2++=*pt1++; + } + *pt2=0; + tret=0; + } + else + { + tret=Transform_Entry(pl->entry, line_buffer); + } + if(!tret) + { + if((pl->type==TYP_PICHTML) || (pl->type==TYP_TXTHTML)) + { + if((rptr=translate_url(line_buffer, pl->type, pl->absolute))!=NULL) + { + strcpy(line_buffer,rptr); + } + else + { + close_jpg_gif_png(); + ShowMessage(prs_translate("Formatfehler der URL in der tuxwetter.conf",CONVERT_LIST),1); + dloop=-1; + break; + } + } + + if((pl->type==TYP_PICHTML) || (pl->type==TYP_PICTURE)) + { + if(pl->pictype==PTYP_ASK) + { + if((rptr=strrchr(line_buffer,'.'))!=NULL) + { + ++rptr; + if(strncasecmp(rptr,"JPG",3)==0) + { + pl->pictype=PTYP_JPG; + } + else + { + if(strncasecmp(rptr,"GIF",3)==0) + { + pl->pictype=PTYP_GIF; + } + else + { + if(strncasecmp(rptr,"PNG",3)==0) + { + pl->pictype=PTYP_PNG; + } + } + } + } + } + if(pl->pictype==PTYP_ASK) + { + close_jpg_gif_png(); + ShowMessage(prs_translate("Nicht unterstütztes Dateiformat",CONVERT_LIST),1); + dloop=-1; + break; + } + } + + + + if((pl->type==TYP_TXTHTML) || (pl->type==TYP_TEXTPAGE) || (pl->type==TYP_TXTPLAIN)) + { + if(gmodeon) + { + close_jpg_gif_png(); + ShowInfo(&menu); + } + if(!cmdline) + { + ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); + } + } + else + { + if(!gmodeon && !cmdline) + { + ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); + } + } +/* + LCD_Clear(); + LCD_draw_rectangle (0,0,119,59, LCD_PIXEL_ON,LCD_PIXEL_OFF); + LCD_draw_rectangle (3,3,116,56, LCD_PIXEL_ON,LCD_PIXEL_OFF); + lpos=strlen(nstr); + lrow=0; + while(lpos>0) + { + strncpy(dstr,nstr+LCD_CPL*lrow,LCD_CPL); + lpos-=LCD_CPL; + LCD_draw_string(13, (lrow+2)*LCD_RDIST, dstr); + lrow++; + } + LCD_update(); + ferr=(strlen(line_buffer))?0:-1; +*/ + if((!ferr) && ((strcmp(line_buffer,lastpicture)!=0)||(loadalways)) && (pl->pictype!=TYP_TXTHTML)) + { + rptr=line_buffer; + if(*rptr=='\"') + { + ++rptr; + } + printf("Tuxwetter \n",rptr); + ferr=HTTP_downloadFile(rptr, (pl->pictype==PTYP_JPG)?JPG_FILE:(pl->pictype==PTYP_PNG)?PNG_FILE:(pl->pictype==PTYP_GIF)?GIF_FILE:PHP_FILE, 1, intype, ctmo, 2); + } + + if(!ferr) + { + switch(pl->pictype) + { + case PTYP_JPG: + tret=show_jpg(JPG_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1); + break; + + case PTYP_PNG: + tret=show_png(PNG_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1); + break; + + case PTYP_GIF: + tret=show_gif(GIF_FILE, sx, sy, ex-sx, ey-sy, 5, pl->repeat, 0, 1, (strcmp(line_buffer,lastpicture)==0)); + break; + + case TYP_TEXTPAGE: + tret=show_php(PHP_FILE, nstr, 0, 1); + break; + + case TYP_TXTHTML: + tret=show_php(PHP_FILE, nstr, 0, 0); + break; + + case TYP_TXTPLAIN: + { + FILE *fh1,*fh2; + int cnt=0; + char *pt1; + + tret=-1; + if((fh1=fopen(PHP_FILE,"r"))!=NULL) + { + if((fh2=fopen(TMP_FILE,"w"))!=NULL) + { + while(fgets(rstr, BUFSIZE-1,fh1)) + { + TrimString(rstr); + pt1=rstr; + cnt=0; + fprintf(fh2,"
"); + while(*pt1) + { + if(*pt1==' ' && cnt>40) + { + fprintf(fh2,"\n
"); + cnt=0; + } + else + { + fputc(*pt1,fh2); + ++cnt; + } + ++pt1; + } + fprintf(fh2,"\n"); + } +// fprintf(fh2,"

\n"); + fclose(fh2); + tret=show_php(TMP_FILE, nstr, 1, 0); + if(cindex==-98 && tret==KEY_RED) + { + xremove(MISS_FILE); + } + } + fclose(fh1); + } + } + break; + } + + if(cindex!=-98) + { + strncpy(lastpicture,line_buffer,BUFSIZE); + + index=menu.act_entry; + switch(tret) + { + case -1: + close_jpg_gif_png(); + ShowMessage(prs_translate("Datei kann nicht angezeigt werden.",CONVERT_LIST),1); + dloop=-1; + break; + + case KEY_UP: + case KEY_VOLUMEDOWN: + if(--index < 0) + { + index=menu.num_entrys-1; + } + break; + + case KEY_DOWN: + case KEY_VOLUMEUP: + if(++index>=menu.num_entrys) + { + index=0; + } + break; + + case KEY_LEFT: + *lastpicture=0; + case KEY_RIGHT: + break; + + default: + dloop=0; + break; + } + menu.act_entry=index; + pl=menu.list[menu.act_entry]; + if((pl->type!=TYP_PICTURE) && (pl->type!=TYP_PICHTML) && (pl->type!=TYP_TXTHTML) && (pl->type!=TYP_TXTPLAIN) && (pl->type!=TYP_TEXTPAGE)) + { + dloop=0; + cindex=99; + } + } + else + { + dloop=0; + } + } + else + { + close_jpg_gif_png(); + sprintf(tstr,"%s",prs_translate("Fehler",CONVERT_LIST)); + sprintf(tstr,"%s %d %s.",tstr,ferr,prs_translate("beim Download",CONVERT_LIST)); + ShowMessage(tstr,1); + ferr = 0; + dloop=-1; + } + + + + } + else + { + close_jpg_gif_png(); + ShowMessage(prs_translate("Formatfehler der URL in der tuxwetter.conf",CONVERT_LIST),1); + dloop=-1; + break; + } + } + while(dloop>0); + close_jpg_gif_png(); + break; + + case TYP_CITY: + if(!prs_get_city()) + { + + rcm = -1; + sprintf(tstr," "); + + Clear_List(&funcs, 1); + funcs.act_entry=0; + + sprintf(tstr,"%s %s",prs_translate("Wetterdaten für",CONVERT_LIST),city_name); + if(funcs.headertxt[0]) + { + free(funcs.headertxt[0]); + } + funcs.headertxt[0]=strdup(tstr); + + for(index=0; index1) + { + sprintf(tstr,"%s %s",prs_translate("Vorschau für",CONVERT_LIST),rstr); + } + else + { + if(index==1) + { + sprintf(tstr,"%s",prs_translate("Wochentrend",CONVERT_LIST)); + } + else + { + sprintf(tstr,"%s",prs_translate("Aktuelles Wetter",CONVERT_LIST)); + } + } + AddListEntry(&funcs,tstr, 0); + } + wloop=1; + while(wloop) + { + clear_screen(); + switch(Get_Selection(&funcs)) + { + case -99: + show_data(-99); + break; + + case -1: + mainloop=0; + wloop=0; + break; + + case 0: + wloop=0; + break; + + case 1: + dloop=1; + while(dloop>0) + { + if(!cmdline) + { + ShowMessage(prs_translate("Bitte warten",CONVERT_LIST),0); + } + show_data(funcs.act_entry); + rce=GetRCCode(); + while((rce != KEY_OK) && (rce != KEY_EXIT) && (rce != KEY_DOWN) && (rce != KEY_UP) && (rce != KEY_VOLUMEUP) && (rce != KEY_VOLUMEDOWN)) + { + rce=GetRCCode(); + } + index=funcs.act_entry; + if(gmodeon) + { + close_jpg_gif_png(); + } + switch(rce) + { + case KEY_UP: + case KEY_VOLUMEDOWN: + if(--index < 0) + { + index=MAX_FUNCS-1; + } + break; + + case KEY_DOWN: + case KEY_VOLUMEUP: + if(++index>=MAX_FUNCS) + { + index=0; + } + break; + + case KEY_OK: + case KEY_EXIT: + dloop=0; + break; + } + funcs.act_entry=index; + } + } + } + } + break; + } + break; + } + clear_screen(); + if(cindex==-98 && epl.entry) + { + free(epl.entry); + epl.entry=NULL; + } + + if(cmdline) + { + mainloop=0; + } + } + + //cleanup + + // clear Display + free(proxyadress); + free(proxyuserpwd); + + Clear_List(&menu,-1); + Clear_List(&funcs,-1); + + free(trstr); + if(cmdline) + { + free(cmdline); + } + + FTC_Manager_Done(manager); + FT_Done_FreeType(library); + + close_jpg_gif_png(); + +// clear_lcd(); + + CloseRC(); + + for(index=0; index<32; index++) + { + sprintf(tstr,"%s%02d.gif",GIF_MFILE,index); + xremove(tstr); + } + sprintf(tstr,"[ -e /tmp/picture* ] && rm /tmp/picture*"); + system(tstr); + xremove("/tmp/tuxwettr.tmp"); + xremove("/tmp/bmps.tar"); + xremove("/tmp/icon.gif"); + xremove("/tmp/tempgif.gif"); + xremove(PHP_FILE); + put_instance(get_instance()-1); + + if((tfh=fopen(TIME_FILE,"r"))!=NULL) + { + fclose(tfh); + sprintf(line_buffer,"%s &",TIME_FILE); + system(line_buffer); + free(line_buffer); + } + + + // clear Display + memset(lbb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); + memcpy(lfb, lbb, fix_screeninfo.line_length*var_screeninfo.yres); +// memset(lfb, TRANSP, fix_screeninfo.line_length*var_screeninfo.yres); + munmap(lfb, fix_screeninfo.smem_len); + close(fb); + free(lbb); + return 0; +} diff --git a/tuxwetter.cfg b/tuxwetter.cfg new file mode 100644 index 0000000..3b98be0 --- /dev/null +++ b/tuxwetter.cfg @@ -0,0 +1,7 @@ +type=2 +name=CS-Tuxwetter +desc=Wettervorhersage +needfb=1 +needrc=1 +needlcd=1 +needoffs=1 diff --git a/tuxwetter.conf b/tuxwetter.conf new file mode 100755 index 0000000..5229083 --- /dev/null +++ b/tuxwetter.conf @@ -0,0 +1,452 @@ +#################################################################################### +#### CS-Tuxwetter Version 3.01 Beta +#### Aktuelle Wetterinfos, Wettervorhersagen und mehr. +#################################################################################### +# +# Konfigurationsdatei für CS-Tuxwetter +# +# InetConnection=ISDN/ANALOG für langsamere Verbindungen zur Konfiguration von Timeoutzeiten +# beim Download und des Fortschrittsbalkens, kann bei DSL entfallen +# +# Nutzer eine Proxservers können diesen dem Plugin mit folgenden Einträgen bekanntmachen +# +# ProxyAdressPort=ProxyAdresse:ProxyPort +# ProxyUserPwd=Username:Passwort +# +# Beispiel: +# ProxyAdressPort=192.168.0.128:8080 +# ProxyUserPwd=username1:passwort1 +# +# Beispiele für worldweatheronline.com +# Suche: +# http://www.worldweatheronline.com/feed/search.ashx?key=xxxxxxxx&format=xml&q=Frankfurt +# +# Abfrage über Name: +# http://free.worldweatheronline.com/feed/weather.ashx?key=xxxxxxxx&num_of_days=5&includeLocation=yes&q=Frankfurt +# +# Abfrage über Längen-/Breitengrad +# http://free.worldweatheronline.com/feed/weather.ashx?key=xxxxxxxx&num_of_days=5&includeLocation=yes&q=52.350,14.550 + +MENU=CS-Tuxwetter + MENU=Favoriten + Stadt=Bremerhaven,Bremerhaven,Germany + Stadt=Iserlohn,Iserlohn,Germany + Stadt=Köln,Koln,Germany + Stadt=München,Munchen,Germany + ENDMENU + MENU=Wetterdaten + MENU=Deutschland + MENU=Städte A-B + Stadt=Aachen,Aachen,Germany + Stadt=Ahaus,Ahaus,Germany + Stadt=Ahrensburg,Ahrensburg,Germany + Stadt=Allendorf,Allendorf,Germany + Stadt=Alsenz,Alsenz,Germany + Stadt=Altenbruch,Altenbruch,Germany + Stadt=Amberg,Amberg,Germany + Stadt=Ansbach,Ansbach,Germany + Stadt=Aschaffenburg,Aschaffenburg,Germany + Stadt=Augsburg,Augsburg,Germany + Stadt=Aurich,Aurich,Germany + Stadt=Bad Hersfeld,Bad%20Hersfeld,Germany + Stadt=Bad Tölz,Bad%20Tolz,Germany + Stadt=Bamberg,Bamberg,Germany + Stadt=Bayreuth,Bayreuth,Germany + Stadt=Bergisch-Gladbach,Bergisch%20Gladbach,Germany + Stadt=Berlin,Berlin,Germany + Stadt=Bielefeld,Bielefeld,Germany + Stadt=Bitburg,Bitburg,Germany + Stadt=Blexen,Blexen,Germany + Stadt=Bonn,Bonn,Germany + Stadt=Bottrop,Bottrop,Germany + Stadt=Brandenburg,Brandenburg,Germany + Stadt=Braunschweig,Braunschweig,Germany + Stadt=Bremen,Bremen,Germany + Stadt=Bremerhaven,Bremerhaven,Germany + Stadt=Brunsbüttel,Brunsbuttel,Germany + Stadt=Bückeburg,Buckeburg,Germany + ENDMENU + MENU=Städte C-D + Stadt=Celle,Celle,Germany + Stadt=Chemnitz,Chemnitz,Germany + Stadt=Cloppenburg,Cloppenburg,Germany + Stadt=Coburg,Coburg,Germany + Stadt=Cottbus,Cottbus,Germany + Stadt=Cuxhaven,Cuxhaven,Germany + Stadt=Dachau,Dachau,Germany + Stadt=Darmstadt,Darmstadt,Germany + Stadt=Deggendorf,Deggendorf,Germany + Stadt=Delmenhorst,Delmenhorst,Germany + Stadt=Dessau,Dessau,Germany + Stadt=Detmold,Detmold,Germany + Stadt=Döbeln,Dobeln,Germany + Stadt=Donaueschingen,Donaueschingen,Germany + Stadt=Dortmund,Dortmund,Germany + Stadt=Dresden,Dresden,Germany + Stadt=Duhnen,Duhnen,Germany + Stadt=Duisburg,Duisburg,Germany + Stadt=Düsseldorf,Dusseldorf,Germany + ENDMENU + MENU=Städte E-F + Stadt=Ebersberg,Ebersberg,Germany + Stadt=Eberswalde,Eberswalde,Germany + Stadt=Eckernförde,Eckernforde,Germany + Stadt=Eggenfelden,Eggenfelden,Germany + Stadt=Eichstätt,Eichstatt,Germany + Stadt=Elmshorn,Elmshorn,Germany + Stadt=Emden,Emden,Germany + Stadt=Erding,Erding,Germany + Stadt=Erfurt,Erfurt,Germany + Stadt=Erlangen,Erlangen,Germany + Stadt=Eschlkam,Eschlkam,Germany + Stadt=Eschwege,Eschwege,Germany + Stadt=Essen,Essen,Germany + Stadt=Esslingen,Esslingen,Germany + Stadt=Euskirchen,Euskirchen,Germany + Stadt=Eutin,Eutin,Germany + Stadt=Falkensee,Falkensee,Germany + Stadt=Feucht,Feucht,Germany + Stadt=Flensburg,Flensburg,Germany + Stadt=Frankfurt am Main,Frankfurt%20Am%20Main,Germany + Stadt=Frankfurt an der Oder,Frankfurt%20An%20Der%20Oder,Germany + Stadt=Freiburg,Freiburg,Germany + Stadt=Freising,Freising,Germany + Stadt=Freudenstadt,Freudenstadt,Germany + Stadt=Freyung,Freyung,Germany + Stadt=Friedrichshafen,Friedrichshafen,Germany + Stadt=Friesoythe,Friesoythe,Germany + Stadt=Fritzlar,Fritzlar,Germany + Stadt=Fulda,Fulda,Germany + Stadt=Fürstenfeldbruck,Furstenfeldbruck,Germany + Stadt=Fürth,Furth,Germany + ENDMENU + MENU=Städte G-H + Stadt=Garmisch-Partenkirchen,Garmisch-Partenkirchen,Germany + Stadt=Geilenkirchen,Geilenkirchen,Germany + Stadt=Gelnhausen,Gelnhausen,Germany + Stadt=Gelsenkirchen,Gelsenkirchen,Germany + Stadt=Gera,Gera,Germany + Stadt=Geretsried,Geretsried,Germany + Stadt=Germersheim,Germersheim,Germany + Stadt=Gettorf,Gettorf,Germany + Stadt=Gießen,Giesen,Germany + Stadt=Glauchau,50.820,12.530 + Stadt=Göppingen,Goppingen,Germany + Stadt=Görlitz,Gorlitz,Germany + Stadt=Göttingen,Gottingen,Germany + Stadt=Grafenau,Grafenau,Germany + Stadt=Grafenwöhr,Grafenwohr,Germany + Stadt=Greifswald,Greifswald,Germany + Stadt=Grünberg,Grunberg,Germany + Stadt=Gütersloh,Gutersloh,Germany + Stadt=Hagen,Hagen,Germany + Stadt=Hahn,Hahn,Germany + Stadt=Halle,Halle,Germany + Stadt=Hamburg,Hamburg,Germany + Stadt=Hamm,Hamm,Germany + Stadt=Hanau,Hanau,Germany + Stadt=Hannover,Hannover,Germany + Stadt=Harrislee,Harrislee,Germany + Stadt=Heidelberg,Heidelberg,Germany + Stadt=Heilbronn,Heilbronn,Germany + Stadt=Helgoland,Helgoland,Germany + Stadt=Hennigsdorf,Hennigsdorf,Germany + Stadt=Herne,Herne,Germany + Stadt=Hildesheim,Hildesheim,Germany + Stadt=Hinte,Hinte,Germany + Stadt=Hochheim,Hochheim,Germany + Stadt=Hof,Hof,Germany + Stadt=Holzkirchen,Holzkirchen,Germany + Stadt=Hürth,Hurth,Germany + Stadt=Husby,Husby,Germany + Stadt=Husum,Husum,Germany + ENDMENU + MENU=Städte I-K + Stadt=Idar-Oberstein,Idar-Oberstein,Germany + Stadt=Ingolstadt,Ingolstadt,Germany + Stadt=Iserlohn,Iserlohn,Germany + Stadt=Itzehoe,Itzehoe,Germany + Stadt=Jever,Jever,Germany + Stadt=Jülich,Julich,Germany + Stadt=Kall,Kall,Germany + Stadt=Karlsruhe,Karlsruhe,Germany + Stadt=Kassel,Kassel,Germany + Stadt=Kaufbeuren,Kaufbeuren,Germany + Stadt=Kempten,Kempten,Germany + Stadt=Kiel,Kiel,Germany + Stadt=Kitzingen,Kitzingen,Germany + Stadt=Koblenz,Koblenz,Germany + Stadt=Köln,Koln,Germany + Stadt=Konstanz,Konstanz,Germany + Stadt=Krefeld,Krefeld,Germany + Stadt=Kronshagen,Kronshagen,Germany + Stadt=Krumbach,Krumbach,Germany + ENDMENU + MENU=Städte L-M + Stadt=Laarbruch,Laarbruch,Germany + Stadt=Lahr,Lahr,Germany + Stadt=Landshut,Landshut,Germany + Stadt=Langenhagen,Langenhagen,Germany + Stadt=Lechfeld,Lechfeld,Germany + Stadt=Leck,Leck,Germany + Stadt=Leer,Leer,Germany + Stadt=Leipzig,Leipzig,Germany + Stadt=Leverkusen,Leverkusen,Germany + Stadt=Lindenberg,Lindenberg,Germany + Stadt=List,List,Germany + Stadt=Lübeck,Lubeck,Germany + Stadt=Lüchow,Luchow,Germany + Stadt=Luckenwalde,Luckenwalde,Germany + Stadt=Ludwigsburg,Ludwigsburg,Germany + Stadt=Ludwigshafen,Ludwigshafen,Germany + Stadt=Lüneburg,Luneburg,Germany + Stadt=Magdeburg,Magdeburg,Germany + Stadt=Mainz,Mainz,Germany + Stadt=Mannheim,Mannheim,Germany + Stadt=Marburg,Marburg,Germany + Stadt=Marienfelde,Marienfelde,Germany + Stadt=Marktbreit,Marktbreit,Germany + Stadt=Meiningen,Meiningen,Germany + Stadt=Memmingen,Memmingen,Germany + Stadt=Meppen,Meppen,Germany + Stadt=Merzig,Merzig,Germany + Stadt=Minden,Minden,Germany + Stadt=Mönchengladbach,Monchengladbach,Germany + Stadt=Oldersum,Oldersum,Germany + Stadt=Mühldorf,Muhldorf,Germany + Stadt=München,Munchen,Germany + Stadt=Münster,Munster,Germany + Stadt=Murnau,Murnau,Germany + Stadt=Mylau,50.620,12.270 + ENDMENU + MENU=Städte N-O + Stadt=Naumburg,Naumburg,Germany + Stadt=Neubrandenburg,Neubrandenburg,Germany + Stadt=Neumarkt,Neumarkt,Germany + Stadt=Neumünster,Neumunster,Germany + Stadt=Neunkirchen,Neunkirchen,Germany + Stadt=Neuruppin,Neuruppin,Germany + Stadt=Neuss,Neuss,Germany + Stadt=Neuwied,Neuwied,Germany + Stadt=Niendorf,Niendorf,Germany + Stadt=Norden,Norden,Germany + Stadt=Nordenham,Nordenham,Germany + Stadt=Norderney,Norderney,Germany + Stadt=Nordhausen,Nordhausen,Germany + Stadt=Nordhorn,Nordhorn,Germany + Stadt=Nördlingen,Nordlingen,Germany + Stadt=Oberhausen,Oberhausen,Germany + Stadt=Oberpfaffenhofen,Oberpfaffenhofen,Germany + Stadt=Oberstdorf,Oberstdorf,Germany + Stadt=Ochsenfurt,Ochsenfurt,Germany + Stadt=Oeversee,Oeversee,Germany + Stadt=Offenbach,Offenbach,Germany + Stadt=Oldenburg,Oldenburg,Germany + Stadt=Oranienburg,Oranienburg,Germany + Stadt=Osnabrück,Osnabruck,Germany + Stadt=Otterndorf,Otterndorf,Germany + ENDMENU + MENU=Städte P-R + Stadt=Paderborn,Paderborn,Germany + Stadt=Passau,Passau,Germany + Stadt=Peine,Peine,Germany + Stadt=Pfaffenhofen,Pfaffenhofen,Germany + Stadt=Pfarrkirchen,Pfarrkirchen,Germany + Stadt=Pforzheim,Pforzheim,Germany + Stadt=Pinneberg,Pinneberg,Germany + Stadt=Pirmasens,Pirmasens,Germany + Stadt=Plauen,Plauen,Germany + Stadt=Pocking,Pocking,Germany + Stadt=Potsdam,Potsdam,Germany + Stadt=Prenzlau,Prenzlau,Germany + Stadt=Quickborn,Quickborn,Germany + Stadt=Rastede,Rastede,Germany + Stadt=Recklinghausen,Recklinghausen,Germany + Stadt=Regensburg,Regensburg,Germany + Stadt=Remscheid,Remscheid,Germany + Stadt=Rendsburg,Rendsburg,Germany + Stadt=Rennerod,Rennerod,Germany + Stadt=Rosenheim,Rosenheim,Germany + Stadt=Rostock,Rostock,Germany + Stadt=Rüsselsheim,Russelsheim,Germany + ENDMENU + MENU=Städte S-U + Stadt=Saarbrücken,49.230,7.000 + Stadt=Sahlenburg,53.870,8.630 + Stadt=Salzgitter,52.080,10.330 + Stadt=Salzwedel,52.850,11.150 + Stadt=Schiffdorf,53.530,8.650 + Stadt=Schleswig,54.520,9.550 + Stadt=Schrobenhausen,48.550,11.270 + Stadt=Schwabach,49.330,11.030 + Stadt=Schwäbisch Hall,49.110,9.730 + Stadt=Schweinfurt,50.050,10.230 + Stadt=Schwerin,53.630,11.380 + Stadt=Siegburg,50.800,7.200 + Stadt=Siegen,50.870,8.030 + Stadt=Solingen,51.180,7.080 + Stadt=Starnberg,48.000,11.350 + Stadt=Straubing,48.880,12.570 + Stadt=Stuttgart,48.770,9.180 + Stadt=Sulingen,52.680,8.800 + Stadt=Sylt,54.880,8.350 + Stadt=Tönning,54.320,8.950 + Stadt=Travemünde,53.970,10.870 + Stadt=Trier,49.750,6.630 + Stadt=Tübingen,48.530,9.050 + Stadt=Ulm,48.400,10.000 + ENDMENU + MENU=Städte V-Z + Stadt=Veitsbronn,49.520,10.880 + Stadt=Villingen-Schwenningen,48.070,8.450 + Stadt=Vilsbiburg,48.450,12.350 + Stadt=Vilshofen,48.620,13.180 + Stadt=Waldkirchen/Bayr.-Wald,48.730,13.600 + Stadt=Wallsbüll,54.580,9.000 + Stadt=Warnemünde,54.170,12.080 + Stadt=Weiden,49.680,12.160 + Stadt=Weimar,50.980,11.320 + Stadt=Weißenburg/Bayern,49.030,10.980 + Stadt=Werdau,50.730,12.380 + Stadt=Wernigerode,51.830,10.780 + Stadt=Westerland/Sylt,54.900,8.300 + Stadt=Westerstede,53.250,7.930 + Stadt=Wetzlar,50.550,8.500 + Stadt=Wiesbaden,50.080,8.250 + Stadt=Wilhelmshaven,53.520,8.130 + Stadt=Wittenberge,53.000,11.750 + Stadt=Wittingen,52.730,10.720 + Stadt=Wolfsburg,52.430,10.800 + Stadt=Wuppertal,51.270,7.180 + Stadt=Würzburg,49.790,9.940 + Stadt=Zeven,53.300,9.280 + Stadt=Zirndorf,49.450,10.950 + Stadt=Zwickau,50.720,12.500 + ENDMENU + ENDMENU + MENU=Aktuelles vom Wetterdienst(D) + MENU=Deutschland + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Deutschland.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Deutschland_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Deutschland_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Deutschland_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Deutschland_ueberm_spaet.jpg + ENDMENU + MENU=Region Nord-West + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Nordwest.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Nordwest_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Nordwest_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Nordwest_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Nordwest_ueberm_spaet.jpg + ENDMENU + MENU=Region Nord-Ost + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Nordost.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Nordost_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Nordost_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Nordost_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Nordost_ueberm_spaet.jpg + ENDMENU + MENU=Region West + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/West.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/West_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/West_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/West_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/West_ueberm_spaet.jpg + ENDMENU + MENU=Region Ost + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Ost.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Ost_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Ost_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Ost_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Ost_ueberm_spaet.jpg + ENDMENU + MENU=Region Mitte + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Mitte.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Mitte_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Mitte_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Mitte_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Mitte_ueberm_spaet.jpg + ENDMENU + MENU=Region Süd-Ost + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Suedost.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Suedost_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Suedost_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Suedost_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Suedost_ueberm_spaet.jpg + ENDMENU + MENU=Region Süd-West + PICTURE=heute-aktuell,http://www.dwd.de/wundk/wetter/de/Suedwest.jpg + PICTURE=morgen-früh,http://www.dwd.de/wundk/wetter/de/Suedwest_morgen_frueh.jpg + PICTURE=morgen-spät,http://www.dwd.de/wundk/wetter/de/Suedwest_morgen_spaet.jpg + PICTURE=übermorgen-früh,http://www.dwd.de/wundk/wetter/de/Suedwest_ueberm_frueh.jpg + PICTURE=übermorgen-spät,http://www.dwd.de/wundk/wetter/de/Suedwest_ueberm_spaet.jpg + ENDMENU + ENDMENU + ENDMENU + MENU=Seewetter + PICTURE=Nordsee,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Bild__default,property=default.jpg + PICTURE=Nordsee +24h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__Bild__default,property=default.jpg + PICTURE=Nordsee +48h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__48__Bild__default,property=default.jpg + PICTURE=Nordsee +72h,|PNG|http://www.dwd.de/bvbw/generator/DWDWWW/Content/Schifffahrt/Seewetter/Wind__Seegang__Nordsee__72__Bild__default,property=default.jpg + ENDMENU + MENU=Unwetterwarnungen + MENU=Deutschland + PICTURE=DWD Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_0.gif + PICTURE=Sturmwarnung Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_1.gif + PICTURE=Starkregen Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_2.gif + PICTURE=Gewitterwarnung Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_3.gif + PICTURE=Glätte Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_4.gif + PICTURE=Schnee Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_5.gif + PICTURE=Frost Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_6.gif + PICTURE=Nebel Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_7.gif + PICTURE=Tauwetter Deutschland,http://www.dwd.de/dyn/app/ws/maps/DE_x_x_8.gif + ENDMENU + MENU=Warnlagen Nordseeküste + TXTHTML=Helgoland,http://www.dwd.de/dyn/app/ws/html/reports/PIH_warning_de.html#WS_ANCHOR_0|| + TXTHTML=Nordfriesland,http://www.dwd.de/dyn/app/ws/html/reports/NFX_warning_de.html#WS_ANCHOR_0|| + TXTHTML=Cuxhaven,http://www.dwd.de/dyn/app/ws/html/reports/CUX_warning_de.html#WS_ANCHOR_0|| + TXTHTML=Bremerhaven,http://www.dwd.de/dyn/app/ws/html/reports/BHV_warning_de.html#WS_ANCHOR_0|| + ENDMENU + ENDMENU + MENU=DAX + PICTURE=Dax Realtime Parkettkamera,|JPG15|http://deutsche-boerse.smarthouse.i24.cc/DAX_chart_realtime.jpg + ENDMENU + MENU=Tagesschau + PICTURE=Tagesschau-Wettervorschau,http://www.tagesschau.de/import/wetter/de-vs-3t.jpg + PICTURE=Tagesschau-Nacht,http://www.tagesschau.de/import/wetter/de-vs-tn.jpg + PICTURE=Tagesschau-Tag,http://www.tagesschau.de/import/wetter/de-vs-tt.jpg + ENDMENU + MENU=Webcams + PICTURE=Frankfurt/Römer,http://www.frankfurt.de/sis/frankfurtbilder/cams/pia/images/webcam_pia.jpg + PICTURE=Frankfurt/Messe,http://www.messefrankfurt.com/corporate/de/images/c003.jpg + PICTURE=Frankfurt/Skyline,http://www.frankfurt.de/sis/frankfurtbilder/cams/64cam/images/webcam_64.jpg + PICTURE=Fulda,http://www.uewag.de/WebCamImage/image.jpg + PICTURE=Hamburg/Rathausmarkt,http://www.hamburger-rathausmarkt.de/rathausmarkt.jpg + PICTURE=Köln-Dom/Rhein,http://www.restaurantoasis.de/WebCam.jpg + PICTURE=Köln-Dom/WDR,http://www.wdr.de/themen/global/webcams/domcam/domcam_live.jpg + PICTURE=Berlin,http://www.dhm.de/webcams/pics/cam4_large.jpg + PICTURE=Berlin,http://www.dhm.de/webcams/pics/cam2_large.jpg + PICTURE=Hannover,http://www.langelaube2.de/webcam/webcam.jpg + PICTURE=Leipzig,http://www.na-klarmann.de/cam.JPG + PICTURE=Schwarzwald/Hütte,http://www.emmendinger-huette.de/bilder/axis.jpg + PICTURE=Sylt,http://www.sylt-wetter.de/livecams/bild02.jpg + PICTURE=Zugspitze,http://www.zugspitze.de/livecamsdata/k1bildww.jpg + PICTURE=ES/Andorra,http://www.el-viking.com/left.jpg + PICTURE=USA/LosAngeles-Airport,http://abclocal.go.com/three/kabc/webcam/web1-2.jpg + PICTURE=USA/LosAngeles-Downtown,http://abclocal.go.com/three/kabc/webcam/web2-1.jpg + PICTURE=USA/LosAngeles-LongBeach,http://abclocal.go.com/three/kabc/webcam/web1-1.jpg + PICTURE=USA/NewYork-EmpireStateBuilding,http://www.nyvibe.net/nyvibescam/view.jpg + ENDMENU + MENU=Radiosender Studiocams + PICTURE=Eins Live - Moderator,|JPG10|http://www.einslive.de/webcam/studio_a_1.jpg + PICTURE=Eins Live - Gast,|JPG10|http://www.einslive.de/webcam/studio_a_2.jpg + PICTURE=HIT RADIO FFH - Cam 1,|JPG30|http://resource.ffh.de/webcams/ffh/cam1-fullsize.jpg + PICTURE=HIT RADIO FFH - Cam 2,|JPG30|http://resource.ffh.de/webcams/ffh/cam2-fullsize.jpg + PICTURE=hr3 - Studio 1,|JPG10|http://www.hrfoto.dunkel.de/webcams/hr3/studio1.jpg + PICTURE=hr3 - Studio 2,|JPG10|http://www.hrfoto.dunkel.de/webcams/hr3/studio2.jpg + PICTURE=N-JOY,|JPG30|http://data.ndr.de/webcams/njoy/cam.jpg + PICTURE=NDR2 - Studio 1,|JPG30|http://data.ndr.de/webcams/ndr2/cam1.jpg + PICTURE=NDR2 - Studio 2,|JPG30|http://data.ndr.de/webcams/ndr2/cam2.jpg + PICTURE=YOU FM,|JPG10|http://www.hrfoto.dunkel.de/webcams/xxl/studio1.jpg + ENDMENU +ENDMENU diff --git a/tuxwetter.h b/tuxwetter.h new file mode 100644 index 0000000..819d33e --- /dev/null +++ b/tuxwetter.h @@ -0,0 +1,134 @@ +#ifndef __TUXWETTER_H__ + +#define __TUXWETTER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#if HAVE_DVB_API_VERSION == 3 +#include +#endif +#include +#include +#include +#include + +#include +#include FT_FREETYPE_H +#include FT_CACHE_H +#include FT_CACHE_SMALL_BITMAPS_H + +#define BUFSIZE 4095 + +#define MISS_FILE "/var/tuxbox/config/tuxwetter/missing_translations.txt" + +enum {LEFT, CENTER, RIGHT}; + +FT_Error error; +FT_Library library; +FTC_Manager manager; +FTC_SBitCache cache; +FTC_SBit sbit; +#if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0 +FTC_Image_Desc desc; +#else +FTC_ImageTypeRec desc; +#endif +FT_Face face; +FT_UInt prev_glyphindex; +FT_Bool use_kerning; + +// rc codes + +#undef KEY_EPG +#undef KEY_SAT +#undef KEY_STOP +#undef KEY_PLAY + +#define KEY_1 2 +#define KEY_2 3 +#define KEY_3 4 +#define KEY_4 5 +#define KEY_5 6 +#define KEY_6 7 +#define KEY_7 8 +#define KEY_8 9 +#define KEY_9 10 +#define KEY_BACKSPACE 14 +#define KEY_UP 103 +#define KEY_LEFT 105 +#define KEY_RIGHT 106 +#define KEY_DOWN 108 +#define KEY_MUTE 113 +#define KEY_VOLUMEDOWN 114 +#define KEY_VOLUMEUP 115 +#define KEY_POWER 116 +#define KEY_HELP 138 +#define KEY_HOME 102 +#define KEY_EXIT 174 +#define KEY_SETUP 141 +#define KEY_PAGEUP 104 +#define KEY_PAGEDOWN 109 +#define KEY_OK 0x160 +#define KEY_RED 0x18e +#define KEY_GREEN 0x18f +#define KEY_YELLOW 0x190 +#define KEY_BLUE 0x191 + +#define KEY_TVR 0x179 +#define KEY_TTX 0x184 +#define KEY_COOL 0x1A1 +#define KEY_FAV 0x16C +#define KEY_EPG 0x16D +#define KEY_VF 0x175 + +#define KEY_SAT 0x17D +#define KEY_SKIPP 0x197 +#define KEY_SKIPM 0x19C +#define KEY_TS 0x167 +#define KEY_AUDIO 0x188 +#define KEY_REW 0x0A8 +#define KEY_FWD 0x09F +#define KEY_HOLD 0x077 +#define KEY_REC 0x0A7 +#define KEY_STOP 0x080 +#define KEY_PLAY 0x0CF + +//devs + +int fb; + +//framebuffer stuff + +enum {FILL, GRID}; + +enum {CMCST, CMCS, CMCT, CMC, CMCIT, CMCI, CMHT, CMH, WHITE, BLUE0, GTRANSP, CMS, ORANGE, GREEN, YELLOW, RED, CMCP0, CMCP1, CMCP2, CMCP3}; +#define TRANSP 0 + +extern int FSIZE_BIG; +extern int FSIZE_MED; +extern int FSIZE_SMALL; +extern int FSIZE_VSMALL; +extern int TABULATOR; + +extern unsigned char *lfb, *lbb; +extern unsigned char *proxyadress, *proxyuserpwd; +struct fb_fix_screeninfo fix_screeninfo; +struct fb_var_screeninfo var_screeninfo; +extern unsigned char rd[],gn[],bl[],tr[]; + +int startx, starty, sx, ex, sy, ey, debounce, rblock; +extern unsigned sc[8], tc[8]; +extern int instance; +int get_instance(void); +void put_instance(int pval); + +#define FB_DEVICE "/dev/fb/0" + +#endif + diff --git a/tuxwetter.mcfg b/tuxwetter.mcfg new file mode 100644 index 0000000..3ba8987 --- /dev/null +++ b/tuxwetter.mcfg @@ -0,0 +1,14 @@ +# Metric=1/0 Einheiten metrisch anzeigen +Metric=1 +# InetConnection=ISDN/ANALOG fuer langsamere Verbindungen zur Konfiguration von Timeoutzeiten +InetConnection=DSL +ConnectTimeout=5 +# Account bei weather.com Bei worldweatheronline.com wird der LicenseKey als ACode verwendet +#PartnerID=1005530704 +#LicenseKey=a9c95f7636ad307b +#LicenseKey=A2550021575 +LicenseKey=3d3a896d1e152006112211 +# SplashScreen=1/0 Startbildschirm anzeigen / nicht anzeigen +SplashScreen=0 +# ShowIcons=1/0 Wetter-Icons für Textanzeige downloaden / nicht downloaden +ShowIcons=1 \ No newline at end of file -- 2.39.5