From: svenhoefer Date: Tue, 14 Aug 2012 20:14:22 +0000 (+0200) Subject: * initial commit X-Git-Url: https://git.webhop.me/?a=commitdiff_plain;h=55e0a8ccaa120b16c878a0f2ff59774b03239fbf;p=tuxwetter.git * initial commit --- 55e0a8ccaa120b16c878a0f2ff59774b03239fbf 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 0000000..bcda64f Binary files /dev/null and b/startbild.jpg differ 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