diff options
author | Brian Bidulock | 2015-06-10 22:53:20 -0600 |
---|---|---|
committer | Brian Bidulock | 2015-06-10 22:53:20 -0600 |
commit | ee4d9c80a888c0d5cd262648fd2b3db3d4d21bfb (patch) | |
tree | 132edf34806e505722ff282431c6ce19da8bc3cc | |
download | aur-ee4d9c80a888c0d5cd262648fd2b3db3d4d21bfb.tar.gz |
initial version
-rw-r--r-- | .SRCINFO | 26 | ||||
-rw-r--r-- | 20-weather.pl.patch | 176 | ||||
-rw-r--r-- | PKGBUILD | 57 | ||||
-rw-r--r-- | debian-orig.patch | 20 | ||||
-rw-r--r-- | new-station-lookup-url.patch | 17 | ||||
-rw-r--r-- | renamed-wmfrog.c.patch | 696 | ||||
-rw-r--r-- | weather.pl-new-line-skip.patch | 20 | ||||
-rw-r--r-- | wmfrog.1.pod | 109 |
8 files changed, 1121 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..90e03d18f14a --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,26 @@ +pkgbase = wmfrog + pkgdesc = A WindowMaker dock app for weather reports. + pkgver = 0.3.1 + pkgrel = 2 + url = http://sourceforge.net/projects/wmfrog + arch = i686 + arch = x86_64 + license = GPL + depends = libxpm + source = http://downloads.sourceforge.net/wmfrog/wmfrog-0.3.1.tgz + source = debian-orig.patch + source = 20-weather.pl.patch + source = weather.pl-new-line-skip.patch + source = renamed-wmfrog.c.patch + source = new-station-lookup-url.patch + source = wmfrog.1.pod + md5sums = 3469ae5043a7bec538dff31b4a2397ea + md5sums = 7b2fece308e94c6ba2281fae83ece24b + md5sums = 95cb86928984baa7dfe5b5a8870efa09 + md5sums = f8872dc232a91aeaa465f9139068842c + md5sums = 86e8eeb4b5508c30eab08e9f51964e53 + md5sums = 26315cb650d3f26fcd27dcac323f10b2 + md5sums = f16d84c6bc8ea9f432c5055d6354a9f8 + +pkgname = wmfrog + diff --git a/20-weather.pl.patch b/20-weather.pl.patch new file mode 100644 index 000000000000..d0b2f3a3af50 --- /dev/null +++ b/20-weather.pl.patch @@ -0,0 +1,176 @@ +From: Jari Aalto <jari.aalto@cante.net> +Subject: Fix Perl warnings, array subscript, test directory + +Updated by Doug Torrance <dtorrance@monmouthcollege.edu> for new upstream version 0.3.1. + +--- wmfrog-0.3.1.orig/Src/weather.pl ++++ wmfrog-0.3.1/Src/weather.pl +@@ -2,9 +2,9 @@ + #Thibaut Colar: http://www.colar.net/ + #2002/05 + +-#The Weather data can be retrieved through http of ftp. ++#The weather data can be retrieved through http or ftp. + #Http is faster, however this might get broken if NOAA change their webpage layout +-#in wich case you should choose ftp. ++#in which case you should choose ftp. + + $mode="http"; # html || ftp + +@@ -32,7 +32,7 @@ if($mode eq "ftp") + $line=""; + $file="${tmpfolder}/${station}_dat"; + open(DATA,"<$file"); +-$allGood=0; ++#$allGood=0; + if($mode eq "http") + { + while((! ($line=~m/START BODY OF TEXT HERE/)) && !eof(DATA)) +@@ -55,7 +55,7 @@ if(eof(DATA)) + + $line=<DATA>; + chomp $line; +-($junk,$time)=split(/\ /,$line); ++(undef,$time)=split(/\ /,$line); + ($hour,$minute)=split(/:/,$time); + $line=""; + if($mode eq "http") +@@ -82,26 +82,26 @@ debug("args: @args"); + debug("line: $line"); + + $i=0; +-$station=@args[$i]; ++$station=$args[$i]; + if(($station eq 'METAR') or ($station eq 'SPECI')) + { +- $station=@args[$i+1]; ++ $station=$args[$i+1]; + $i++ + } + $i++;#date (ln 1) + $i++;#time (ln 1) + $i++;#station (ln 2) + $i++;#datetime (ln 2) +-$wind=@args[$i]; ++$wind=$args[$i]; + if($wind eq 'AUTO') + { +- $wind=@args[$i+1]; ++ $wind=$args[$i+1]; + $i++; + } + debug("wind: $wind"); + + $i++; +-$visibility=@args[$i]; ++$visibility=$args[$i]; + $i++;#Visibility + debug("vis: $visibility"); + +@@ -109,16 +109,16 @@ debug("vis: $visibility"); + #{ + # $i++; # visibility with fractions, not using + #} +-$next=@args[$i]; ++$next=$args[$i]; + if($next=~m/\//) + { + $i++; # fractional visibility, skipping + } + +-$tmp=""; ++#$tmp=""; + $weather=""; + $clouds=""; +-while((! (@args[$i]=~/\//)) && ($i<@args)) ++while((! ($args[$i]=~/\//)) && ($i<@args)) + { + $intensity=""; + $desc=""; +@@ -126,7 +126,7 @@ while((! (@args[$i]=~/\//)) && ($i<@args + $obsc=""; + $misc=""; + $j=0; +- $curent=@args[$i]; ++ $curent=$args[$i]; + + debug("cur : $curent"); + +@@ -140,7 +140,7 @@ while((! (@args[$i]=~/\//)) && ($i<@args + if($curent=~/^VV/) + { + $clouds.="VV,".substr($curent,2,3).";"; +- $wasNotCloud="yes"; ++ #$wasNotCloud="yes"; + } + if(($curent=~/^CLR/) or ($curent=~/^SCK/) or ($curent=~/^FEW/) or ($curent=~/^SCT/) or ($curent=~/^BKN/) or ($curent=~/^OVC/)) + { +@@ -193,7 +193,7 @@ while((! (@args[$i]=~/\//)) && ($i<@args + } + $i++; + } +-($temp,$dew)=split(/\//,@args[$i]); ++($temp,$dew)=split(/\//,$args[$i]); + + + $dir=substr($wind,0,3); +@@ -264,31 +264,36 @@ debug("Dew:$dew"); + + + #check for ok temperature +-open(GREP, "grep Temp $tmpfolder/${station} | "); +-$templine=<GREP>; +-$templine=~m/^Temp:(.*)$/; ++if ( -d "$tmpfolder/$station" ) + { +- $lattemp=$1; +- if($temp>-50 && $temp<150) +- { +- if($lasttemp>-50 && $lasttemp<150) +- { +- if($temp>-2 && $temp<2) +- { +- if($lasttemp>7 || $lasttemp<-7) +- { +- #probably invalid +- $station=""; +- } +- } +- } +- } +- else +- { +- $station=""; +- } ++ open(GREP, "grep Temp $tmpfolder/${station} | "); ++ $templine=<GREP>; ++ ++ $templine=~m/^Temp:(.*)$/; ++ { ++ # $lattemp=$1; ++ if($temp>-50 && $temp<150) ++ { ++ if($lasttemp>-50 && $lasttemp<150) ++ { ++ if($temp>-2 && $temp<2) ++ { ++ if($lasttemp>7 || $lasttemp<-7) ++ { ++ #probably invalid ++ $station=""; ++ } ++ } ++ } ++ } ++ else ++ { ++ #invalid ++ $station=""; ++ } ++ } ++ close GREP; + } +-close GREP; + + debug("Station: $station"); + diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..a573fda3e07b --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,57 @@ +# Maintainer: Brian Bidulock <bidulock@openss7.org> + +pkgname=wmfrog +pkgdesc="A WindowMaker dock app for weather reports." +pkgver=0.3.1 +pkgrel=2 +arch=(i686 x86_64) +url="http://sourceforge.net/projects/wmfrog" +license=('GPL') +depends=('libxpm') +source=("http://downloads.sourceforge.net/wmfrog/wmfrog-0.3.1.tgz" + "debian-orig.patch" + "20-weather.pl.patch" + "weather.pl-new-line-skip.patch" + "renamed-wmfrog.c.patch" + "new-station-lookup-url.patch" + "wmfrog.1.pod") +md5sums=('3469ae5043a7bec538dff31b4a2397ea' + '7b2fece308e94c6ba2281fae83ece24b' + '95cb86928984baa7dfe5b5a8870efa09' + 'f8872dc232a91aeaa465f9139068842c' + '86e8eeb4b5508c30eab08e9f51964e53' + '26315cb650d3f26fcd27dcac323f10b2' + 'f16d84c6bc8ea9f432c5055d6354a9f8') + +prepare() { + cd "${srcdir}" + patch -Np1 -b -z .orig -i debian-orig.patch + patch -Np1 -b -z .orig -i 20-weather.pl.patch + patch -Np1 -b -z .orig -i weather.pl-new-line-skip.patch + patch -Np1 -b -z .orig -i renamed-wmfrog.c.patch + patch -Np1 -b -z .orig -i new-station-lookup-url.patch +} + +build() { + cd "${srcdir}/Src" + make CFLAGS="$CFLAGS $CPPFLAGS $LDFLAGS" + pod2man --utf8 \ + --center="User Commands" \ + --date="`date '+%Y-%m-%d'`" \ + --errors="none" \ + --fixed="CW" \ + --fixedbold="CB" \ + --fixeditalic="CI" \ + --fixedbolditalic="CX" \ + --name="WMFROG" \ + --nourls \ + --release="$pkgname $pkgver" \ + --section="1" \ + ../wmfrog.1.pod >wmfrog.1 +} + +package() { + cd "${srcdir}/Src" + make DESTDIR="${pkgdir}" install + install -Dm0644 wmfrog.1 "${pkgdir}/usr/share/man/man1/wmfrog.1" +} diff --git a/debian-orig.patch b/debian-orig.patch new file mode 100644 index 000000000000..f8c524ac2072 --- /dev/null +++ b/debian-orig.patch @@ -0,0 +1,20 @@ +diff -up tmp1/Src/weather.pl.orig tmp1/Src/weather.pl +--- tmp1/Src/weather.pl.orig 2014-05-19 07:39:02.000000000 -0600 ++++ tmp1/Src/weather.pl 2010-12-01 12:37:21.000000000 -0700 +@@ -109,11 +109,11 @@ debug("vis: $visibility"); + #{ + # $i++; # visibility with fractions, not using + #} +-#$next=@args[$i]; +-#if($next=~m/FT/) +-#{ +-# $i++; # visibility in feet, not using +-#} ++$next=@args[$i]; ++if($next=~m/\//) ++{ ++ $i++; # fractional visibility, skipping ++} + + $tmp=""; + $weather=""; diff --git a/new-station-lookup-url.patch b/new-station-lookup-url.patch new file mode 100644 index 000000000000..c71ecc50b416 --- /dev/null +++ b/new-station-lookup-url.patch @@ -0,0 +1,17 @@ +Description: New Metereological Station Information Lookup page + This patch updates the url of the NOAA's Metereological Station Information + Lookup page in the INSTALL documentation file. +Author: Doug Torrance <dtorrance@monmouthcollege.edu> +Last-Update: <2014-04-29> + +--- wmfrog-0.3.1.orig/INSTALL ++++ wmfrog-0.3.1/INSTALL +@@ -37,7 +37,7 @@ You might need to set the location of pe + Use + -------------------------------------------------------------------------------- + Find your METAR station name here: +-http://www.nws.noaa.gov/tg/siteloc.shtml ++http://www.nws.noaa.gov/tg/siteloc.php + For example Reno, NV is KRNO + Also you will want to set your Time offset from UTC(GMT), for example Pacific time is GMT-8, so offset is -8 + diff --git a/renamed-wmfrog.c.patch b/renamed-wmfrog.c.patch new file mode 100644 index 000000000000..fb39c910b934 --- /dev/null +++ b/renamed-wmfrog.c.patch @@ -0,0 +1,696 @@ +Description: Renamed wmFrog.c to wmfrog.c. + Previously, the binary wmfrog was built from the source file wmFrog.c, + resulting in a Lintian "source-is-missing" error. This patch fixes this + issue by renaming wmFrog.c to wmfrog.c. + . + This patch also updates the location of the NOAA's Meterological Station + Information Lookup page and incorporates the s/Dont/Don't/g spelling change + from the original patch 30-wmfrog.c-no-output.patch by Jari Aalto + <jari.aalto@cante.net>. +Author: Doug Torrance <dtorrance@monmouthcollege.edu> +Last-Update: <2014-04-29> + +--- wmfrog-0.3.1.orig/Src/Makefile ++++ wmfrog-0.3.1/Src/Makefile +@@ -8,7 +8,7 @@ LIBS = -lXpm -lX11 -lXext + # LIBS = -lXpm -lX11 -lXext -lsocket + PREFIX=/usr + +-OBJS = wmFrog.o \ ++OBJS = wmfrog.o \ + xutils.o + + +@@ -16,10 +16,10 @@ OBJS = wmFrog.o \ + $(CC) $(CFLAGS) -D$(shell echo `uname -s`) -c $< -o $*.o $(INCDIR) + + +-all: wmFrog.o wmFrog ++all: wmfrog.o wmfrog + +-wmFrog.o: frog.xpm frog.xbm +-wmFrog: $(OBJS) ++wmfrog.o: frog.xpm frog.xbm ++wmfrog: $(OBJS) + $(CC) $(CFLAGS) $(SYSTEM) -o wmfrog $^ $(INCDIR) $(LIBDIR) $(LIBS) + install: + mkdir -p "$(DESTDIR)$(PREFIX)/bin" +--- /dev/null ++++ wmfrog-0.3.1/Src/wmfrog.c +@@ -0,0 +1,656 @@ ++/* ++ Thibaut Colar http://www.colar.net/ 2002/05 ++ This is a dockapp wich shows you the weather at a specific location ++ from it's METAR code. ++ If this program blew up your computer it isn't my fault :-) ++ This use a bit of code borrowed from the wmWeather application(originally). ++ ++ To build from src needs libxpm-dev, libx11-dev, libext-dev ++ */ ++ ++ ++/* ++ * Includes ++ */ ++#include <signal.h> ++#include <stdio.h> ++#include <math.h> ++#include <string.h> ++#include <unistd.h> ++#include <stdlib.h> ++#include <ctype.h> ++#include <time.h> ++#include <pwd.h> ++#include <X11/X.h> ++#include <X11/xpm.h> ++#include "xutils.h" ++#include "frog.xpm" ++#include "frog.xbm" ++ ++ ++ ++/* ++ * Delay between refreshes (in microseconds) ++ */ ++#define DEBUG 0 ++#define VERSION "0.3.1" ++// 5 mn in seconds ++#define DEFAULT_UPDATEDELAY 300L ++// max wind in KNOTS ++#define MAX_WIND 50 ++#define TIME_OFFSET 0 ++#define METRIC 0 ++ ++void ParseCMDLine(int argc, char *argv[]); ++void ButtonPressEvent(XButtonEvent *); ++void KeyPressEvent(XKeyEvent *); ++char *StringToUpper(char *); ++char *mystrsep(char **stringp, char *delim); ++char *GetTempDir(char *suffix); ++void UpdateData(); ++void Repaint(); ++ ++struct WeatherStruct { ++ int intensity; ++ char* precip; ++ char* desc; ++ char* obsc; ++ char* misc; ++ char* coverage; ++ int temp; ++ int dew; ++ float humidity; ++ int hour; ++ int min; ++ int wind; ++ int gust; ++ int dir; ++} weather; ++ ++char StationID[10]; ++char Label[20]; ++int Metric = METRIC; ++int NeedsUpdate = 1; ++int maxWind = MAX_WIND; ++int timeOffset = TIME_OFFSET; ++long UpdateDelay; ++char* folder; ++int needsUpdate = 1; ++ ++/* ++ * main ++ */ ++int main(int argc, char *argv[]) { ++ XEvent event; ++ Display *dis; ++ ++ dis = XOpenDisplay((char *) 0); ++ ++ /* ++ * Parse any command line arguments. ++ */ ++ ParseCMDLine(argc, argv); ++ ++ folder = GetTempDir(".wmapps"); ++ ++ initXwindow(argc, argv); ++ ++ openXwindow(argc, argv, frog_xpm, frog_bits, frog_width, ++ frog_height, "#181818", "#79bdbf", "#ff0000", "#ffbf50", "#c5a6ff"); ++ ++ XSelectInput(dis, win, ExposureMask); ++ ++ // Update the data now .... which calls itself back every x seconds (UpdateDelay) using an alarm ++ UpdateData(); ++ ++ while (1) { ++ while (XPending(display)) { ++ XNextEvent(display, &event); ++ switch (event.type) { ++ case Expose: ++ RedrawWindow(); ++ break; ++ } ++ } ++ // check for events 2x seconds to take it easy on cpu ++ usleep(500000); ++ } ++} ++ ++void Repaint() { ++ int i, y, q; ++ char chr; ++ ++ /* ++ * Clear window. ++ */ ++ copyXPMArea(0, 64, 56, 56, 4, 4); ++ ++ //clouds ++ if (strcmp(weather.coverage, "FEW") == 0) { ++ copyXPMArea(0, 183, 56, 15, 4, 4); ++ } ++ if (strcmp(weather.coverage, "SCT") == 0) { ++ copyXPMArea(56, 183, 56, 15, 4, 4); ++ } ++ if (strcmp(weather.coverage, "BKN") == 0) { ++ copyXPMArea(112, 183, 56, 15, 4, 4); ++ } ++ if (strcmp(weather.coverage, "OVC") == 0 || strcmp(weather.coverage, "VV") == 0) { ++ copyXPMArea(168, 183, 56, 15, 4, 4); ++ } ++ ++ //obstruction ++ if (strcmp(weather.obsc, "") != 0) { //fog ++ if (strcmp(weather.desc, "BL") == 0) ++ copyXPMArea(56, 90, 56, 26, 4, 34); ++ else if (strcmp(weather.desc, "FZ") == 0) ++ copyXPMArea(112, 90, 56, 26, 4, 34); ++ else ++ copyXPMArea(168, 64, 56, 26, 4, 34); ++ } ++ ++ //precipitation ++ if (strcmp(weather.precip, "DZ") == 0) { ++ copyXPMArea(112, 120, 56, 15, 4, 18); ++ } ++ if (strcmp(weather.precip, "RA") == 0) { ++ if (weather.intensity == 0) ++ copyXPMArea(56, 150, 56, 15, 4, 18); ++ if (weather.intensity < 0) ++ copyXPMArea(0, 150, 56, 15, 4, 18); ++ if (weather.intensity > 0) ++ copyXPMArea(112, 150, 56, 15, 4, 18); ++ } ++ ++ if (strcmp(weather.precip, "SN") == 0 || strcmp(weather.precip, "SG") == 0) { ++ if (weather.intensity == 0) ++ copyXPMArea(56, 135, 56, 15, 4, 18); ++ if (weather.intensity > 0) ++ copyXPMArea(112, 135, 56, 15, 4, 18); ++ if (weather.intensity < 0) ++ copyXPMArea(0, 135, 56, 15, 4, 18); ++ } ++ ++ if (strcmp(weather.precip, "IC") == 0 || strcmp(weather.precip, "IC") == 0 || strcmp(weather.precip, "IC") == 0 || strcmp(weather.precip, "IC") == 0) { ++ if (weather.intensity == 0) ++ copyXPMArea(56, 166, 56, 16, 4, 18); ++ if (weather.intensity > 0) ++ copyXPMArea(112, 166, 56, 16, 4, 18); ++ if (weather.intensity < 0) ++ copyXPMArea(0, 166, 56, 16, 4, 18); ++ } ++ ++ //descriptor ++ if (strcmp(weather.desc, "BL") == 0 && strcmp(weather.obsc, "") == 0) { ++ copyXPMArea(56, 64, 56, 26, 4, 34); ++ } ++ if (strcmp(weather.desc, "FZ") == 0 && strcmp(weather.obsc, "") == 0) { ++ copyXPMArea(112, 64, 56, 26, 4, 34); ++ } ++ if (strcmp(weather.desc, "TS") == 0) { ++ if (strcmp(weather.precip, "") != 0) ++ copyXPMArea(164, 150, 56, 15, 4, 18); ++ else ++ copyXPMArea(56, 120, 56, 15, 4, 18); ++ } ++ ++ //special ++ if (strcmp(weather.misc, "") != 0) { ++ copyXPMArea(168, 90, 56, 26, 4, 34); ++ copyXPMArea(0, 120, 56, 15, 4, 18); ++ copyXPMArea(168, 183, 56, 16, 4, 4); ++ ++ } ++ ++ //writtings: ++ ++ //clearing: ++ copyXPMArea(170, 20, 25, 17, 29, 44); ++ copyXPMArea(220, 0, 3, 60, 4, 4); ++ copyXPMArea(220, 0, 3, 60, 57, 4); ++ copyXPMArea(220, 0, 3, 60, 4, 4); ++ ++ //humidity ++ y = (weather.humidity * 58) / 100; ++ copyXPMArea(60, 0, 1, y, 4, 60 - y); ++ copyXPMArea(60, 0, 1, y, 5, 60 - y); ++ ++ //wind & gust ++ ++ y = (weather.gust * 58) / maxWind; ++ copyXPMArea(62, 0, 1, y, 58, 60 - y); ++ copyXPMArea(62, 0, 1, y, 59, 60 - y); ++ y = (weather.wind * 58) / maxWind; ++ copyXPMArea(61, 0, 1, y, 58, 60 - y); ++ copyXPMArea(61, 0, 1, y, 59, 60 - y); ++ ++ //station name ++ for (i = 0; i != 4; i++) { ++ chr = (int) Label[i] - 65; ++ copyXPMArea(chr * 5 + 89, 0, 5, 6, 31 + (i * 5), 45); ++ } ++ ++ //time ++ i = weather.hour / 10; ++ copyXPMArea(89 + (i * 5), 7, 5, 6, 30, 53); ++ i = weather.hour - ((weather.hour / 10)*10); ++ copyXPMArea(89 + (i * 5), 7, 5, 6, 35, 53); ++ copyXPMArea(89 + (52), 7, 1, 6, 41, 53); ++ i = weather.min / 10; ++ copyXPMArea(89 + (i * 5), 7, 5, 6, 43, 53); ++ i = weather.min - ((weather.min / 10)*10); ++ copyXPMArea(89 + (i * 5), 7, 5, 6, 48, 53); ++ ++ ++ //temp ++ ++ q = 10; ++ copyXPMArea(136, 30, 17, 9, q - 1, 22); ++ if (weather.temp < 0) { ++ copyXPMArea(90, 30, 3, 7, q, 23); ++ q += 5; ++ } ++ /*if(temp>100) ++ { ++ copyXPMArea(96, 20, 5, 7, q, 23); ++ q+=6; ++ } ++ */ ++ copyXPMArea(136, 30, 17, 9, (q - 1), 22); ++ ++ i = weather.temp; ++ if (i < 0) ++ i = -i; ++ if (i / 100 > 0) { ++ copyXPMArea(96, 20, 5, 7, q, 23); ++ q += 6; ++ i -= 100; ++ } ++ if ((i == 0 && q > 10) || i / 10 > 0 || q > 10) { ++ copyXPMArea(90 + 6 * (i / 10), 20, 5, 7, q, 23); ++ q += 6; ++ } ++ ++ copyXPMArea(90 + 6 * (i - ((i / 10)*10)), 20, 5, 7, q, 23); ++ q += 5; ++ copyXPMArea(95, 29, 5, 7, q, 23); ++ ++ // wind weather.dir ++ if ((weather.dir >= 0 && weather.dir <= 22) || (weather.dir <= 360 && weather.dir > 337)) ++ copyXPMArea(0, 198, 7, 7, 48, 6); ++ if (weather.dir > 22 && weather.dir <= 67) ++ copyXPMArea(42, 198, 7, 7, 48, 6); ++ if (weather.dir > 67 && weather.dir <= 112) ++ copyXPMArea(14, 198, 7, 7, 48, 6); ++ if (weather.dir > 112 && weather.dir <= 157) ++ copyXPMArea(28, 198, 7, 7, 48, 6); ++ if (weather.dir > 157 && weather.dir <= 202) ++ copyXPMArea(7, 198, 7, 7, 48, 6); ++ if (weather.dir > 202 && weather.dir <= 247) ++ copyXPMArea(35, 198, 7, 7, 48, 6); ++ if (weather.dir > 247 && weather.dir <= 292) ++ copyXPMArea(21, 198, 7, 7, 48, 6); ++ if (weather.dir > 292 && weather.dir <= 337) ++ copyXPMArea(49, 198, 7, 7, 48, 6); ++ ++ /* ++ * Make changes visible ++ */ ++ RedrawWindow(); ++} ++ ++/* ++ * ParseCMDLine() ++ */ ++void ParseCMDLine(int argc, char *argv[]) { ++ ++ int i; ++ void print_usage(); ++ ++ StationID[0] = '\0'; ++ UpdateDelay = DEFAULT_UPDATEDELAY; ++ for (i = 1; i < argc; i++) { ++ ++ if ((!strcmp(argv[i], "-metric")) || (!strcmp(argv[i], "-m"))) { ++ Metric = 1; ++ } else if (!strcmp(argv[i], "-w")) { ++ if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) { ++ ++ fprintf(stderr, "You must give a max wind value with the -w option.\n"); ++ print_usage(); ++ exit(-1); ++ } else if (sscanf(argv[i + 1], "%d", &maxWind) != 1) { ++ fprintf(stderr, "Don't understand the max wind value have entered (%s).\n", argv[i + 1]); ++ print_usage(); ++ exit(-1); ++ } ++ } else if (!strcmp(argv[i], "-o")) { ++ if ((i + 1 >= argc)) { ++ fprintf(stderr, "You must give a time offset value with the -t option.\n"); ++ print_usage(); ++ exit(-1); ++ } else if (sscanf(argv[i + 1], "%d", &timeOffset) != 1) { ++ fprintf(stderr, "Don't understand the time offset value have entered (%s).\n", argv[i + 1]); ++ print_usage(); ++ exit(-1); ++ } ++ ++ ++ } else if (!strcmp(argv[i], "-tmp")) { ++ if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) { ++ fprintf(stderr, "-tmp option invalid.\n"); ++ print_usage(); ++ exit(-1); ++ } ++ strcpy(folder, argv[++i]); ++ ++ ++ } else if ((!strcmp(argv[i], "-station")) || (!strcmp(argv[i], "-s"))) { ++ if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) { ++ fprintf(stderr, "No METAR station ID found\n"); ++ print_usage(); ++ exit(-1); ++ } ++ strcpy(StationID, StringToUpper(argv[++i])); ++ strcpy(Label, StationID); ++ } else if (!strcmp(argv[i], "-delay")) { ++ if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) { ++ ++ fprintf(stderr, "You must give a time with the -delay option.\n"); ++ print_usage(); ++ exit(-1); ++ } else if (sscanf(argv[i + 1], "%ld", &UpdateDelay) != 1) { ++ ++ fprintf(stderr, "Don't understand the delay time you have entered (%s).\n", argv[i + 1]); ++ print_usage(); ++ exit(-1); ++ } ++ /* ++ * Convert Time to seconds ++ */ ++ UpdateDelay *= 60; ++ ++i; ++ } else if (!strcmp(argv[i], "-l")) { ++ if ((i + 1 >= argc) || (argv[i + 1][0] == '-')) { ++ fprintf(stderr, "You must give a station label name.\n"); ++ print_usage(); ++ exit(-1); ++ } ++ strcpy(Label, StringToUpper(argv[++i])); ++ } ++ } ++ ++ if (StationID[0] == '\0') { ++ fprintf(stderr, "\nYou must specify a METAR station code\n\n"); ++ print_usage(); ++ exit(1); ++ } ++} ++ ++void print_usage() { ++ ++ printf("\nwmfrog version: %s\n", VERSION); ++ printf("\nusage: wmfrog -s <StationID> [-h] [-w <max wind>] [-t <time offset>] [-tmp <temp folder>] [-l <label>]\n"); ++ printf(" [-m] [-delay <Time in Minutes>]\n\n"); ++ printf("\n\t-station <METAR StationID>\n"); ++ printf("\t-s <METAR StationID>\tThe 4-character METAR Station ID.\n\n"); ++ printf("\t-metric\n"); ++ printf("\t-m\t\t\t\tDisplay Temperature in metric unit: (Celcius) \n\n"); ++ printf("\t-delay <Time in Minutes>\tOverride time (in minutes) between updates\n"); ++ printf("\t\t\t\t\tdefault is %ld minutes. \n\n", DEFAULT_UPDATEDELAY / 60); ++ ++ printf("\t-w\t\t\t\tSet the maximum wind in KNOTS (for percentage of max / scaling.)\n"); ++ printf("\t\t\t\t\tdefault is %d minutes). (Times are approximate.)\n\n", MAX_WIND); ++ printf("\t-o\t\t\t\tTime offset of location from UTC (7 for calif in summer) \n\n"); ++ printf("\t-tmp\t\t\t\tSet the temporary folder (default is: %s) \n\n", folder); ++ printf("\t-l\t\t\t\tSet a label to replace the station ID \n\n"); ++ ++ printf("\n\nTo find out more about the METAR/TAF system, look at:\n"); ++ printf(" http://www.nws.noaa.gov/oso/oso1/oso12/metar.htm \n\n"); ++ printf("To find your city Metar code go to NOAA's ""Meteorological Station Information\nLookup"" page at:\n\n"); ++ printf(" http://www.nws.noaa.gov/oso/siteloc.php\n\n"); ++ printf("\n Thibaut Colar http://www.colar.net/wmapps/\n\n"); ++ ++} ++ ++/* ++ * Compute the Julian Day number for the given date. ++ * Julian Date is the number of days since noon of Jan 1 4713 B.C. ++ */ ++double jd(ny, nm, nd, UT) ++int ny, nm, nd; ++double UT; ++{ ++ double A, B, C, D, JD, day; ++ ++ day = nd + UT / 24.0; ++ ++ if ((nm == 1) || (nm == 2)) { ++ ny = ny - 1; ++ nm = nm + 12; ++ } ++ ++ if (((double) ny + nm / 12.0 + day / 365.25) >= (1582.0 + 10.0 / 12.0 + 15.0 / 365.25)) { ++ A = ((int) (ny / 100.0)); ++ B = 2.0 - A + (int) (A / 4.0); ++ } else { ++ B = 0.0; ++ } ++ if (ny < 0.0) { ++ C = (int) ((365.25 * (double) ny) - 0.75); ++ } else { ++ C = (int) (365.25 * (double) ny); ++ } ++ ++ D = (int) (30.6001 * (double) (nm + 1)); ++ ++ ++ JD = B + C + D + day + 1720994.5; ++ return (JD); ++ ++} ++ ++// Will be called at regular interval to update the weather data (alarm) ++ ++void UpdateData() { ++ char command[1024], Line[512], FileName[128]; ++ int ign; ++ char* igns; ++ igns = (char*) malloc(512); ++ FILE *fp; ++ char* weatherStr; ++ char* cloudsStr; ++ char* tmp1 = NULL; ++ char* tmp2 = NULL; ++ int keepgoing = 0; ++ int weatherFound = 0; ++ int cloudsFound = 0; ++ char* wtr; ++ char* clds; ++ int i, z; ++ weatherStr = (char*) malloc(512); ++ cloudsStr = (char*) malloc(512); ++ ++ /* ++ * Check the Current Conditions file every (approx.) several seconds. ++ */ ++ weather.intensity = 0; ++ weather.desc = ""; ++ weather.precip = ""; ++ weather.obsc = ""; ++ weather.misc = ""; ++ weather.coverage = ""; ++ weather.dir = -1; ++ weather.temp = 0; ++ weather.dew = 0; ++ weather.humidity = 0; ++ weather.hour = 0; ++ weather.min = 0; ++ weather.wind = 0; ++ weather.gust = 0; ++ /* ++ * Execute Perl script to grab the Latest METAR Report ++ */ ++ snprintf(command, 1024, "/usr/lib/wmfrog/weather.pl %s %s", StationID, folder); ++ //printf("Retrieveing data\n"); ++ ign = system(command); ++ snprintf(FileName, 128, "%s/%s", folder, StationID); ++ //fprintf(stderr,"%s\n\n",FileName); ++ ++ if ((fp = fopen(FileName, "r")) != NULL) { ++ ign = fscanf(fp, "Hour:%d", &weather.hour); ++ igns = fgets(Line, 512, fp); //h ++ ign = fscanf(fp, "Minute:%d", &weather.min); ++ igns = fgets(Line, 512, fp); //mn ++ igns = fgets(igns, 512, fp); //station . ignored ++ ign = fscanf(fp, "WindDir:%d", &weather.dir); ++ igns = fgets(Line, 512, fp); //dir ++ ign = fscanf(fp, "WindSpeed:%d", &weather.wind); ++ igns = fgets(Line, 512, fp); //wind ++ ign = fscanf(fp, "WindGust:%d", &weather.gust); ++ igns = fgets(Line, 512, fp); //gust ++ igns = fgets(weatherStr, 512, fp); //weather ++ weatherFound = (*igns != '\0'); ++ igns = fgets(cloudsStr, 512, fp); //clouds ++ cloudsFound = (*igns != '\0'); ++ ign = fscanf(fp, "Temp:%d", &weather.temp); ++ igns = fgets(Line, 512, fp); //temp ++ ign = fscanf(fp, "Dew:%d", &weather.dew); ++ igns = fgets(Line, 512, fp); //dew ++ ++ if (DEBUG) { ++ printf("hr: %d\n", weather.hour); ++ printf("mn: %d\n", weather.min); ++ printf("wd: %d\n", weather.dir); ++ printf("ws: %d\n", weather.wind); ++ printf("wg: %d\n", weather.gust); ++ printf("temp: %d\n", weather.temp); ++ printf("dew: %d\n", weather.dew); ++ printf("w: %s\n", weatherStr); ++ printf("c: %s\n", cloudsStr); ++ } ++ ++ fclose(fp); ++ ++ if (weatherFound) { ++ wtr = strchr(weatherStr, ':') + 1; // get the part after "Weather:" ++ if (DEBUG) printf("weatherLine: %s\n", wtr); ++ do { ++ tmp1 = mystrsep(&wtr, ";"); ++ if (tmp1 && strlen(tmp1) > 2) { ++ if (DEBUG) printf("tmp1: %s\n", tmp1); ++ tmp2 = mystrsep(&tmp1, ","); ++ ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ if (strcmp("-", tmp2) == 0) { ++ weather.intensity = -1; ++ } else if (strcmp("+", tmp2) == 0) { ++ weather.intensity = +1; ++ } ++ } ++ tmp2 = mystrsep(&tmp1, ","); ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ weather.desc = tmp2; ++ } ++ tmp2 = mystrsep(&tmp1, ","); ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ weather.precip = tmp2; ++ } ++ tmp2 = mystrsep(&tmp1, ","); ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ weather.obsc = tmp2; ++ } ++ tmp2 = mystrsep(&tmp1, ","); ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ weather.misc = tmp2; ++ } ++ } else { ++ keepgoing = 0; ++ } ++ if (DEBUG) printf("Intensity: %d \n", weather.intensity); ++ } while (keepgoing); ++ } ++ ++ ++ if (cloudsFound) { ++ clds = strchr(cloudsStr, ':') + 1; // get the part after "Clouds:" ++ if (DEBUG) printf("cloudsLine: %s\n", clds); ++ do { ++ tmp1 = mystrsep(&clds, ";"); ++ if (DEBUG) printf("tmp1: %s\n", tmp1); ++ if (tmp1 && strlen(tmp1) > 2) { ++ tmp2 = mystrsep(&tmp1, ","); ++ ++ if (tmp2 && strcmp(tmp2, "") != 0) { ++ weather.coverage = tmp2; ++ } ++ } ++ if (DEBUG) printf("Coverage: |%s|\n", weather.coverage); ++ } while (tmp1); ++ } ++ weather.humidity = ((112.0 - 0.1 * weather.temp + weather.dew) / (112.0 + 0.9 * weather.temp)); ++ z = weather.humidity; ++ for (i = 0; i != 8; i++) ++ weather.humidity *= z; ++ weather.humidity *= 100; ++ if (weather.humidity > 100) ++ weather.humidity = 100; ++ if (weather.humidity < 0) ++ weather.humidity = 0; ++ ++ weather.hour = weather.hour + timeOffset; ++ if (weather.hour < 0) ++ weather.hour = 24 + weather.hour; ++ if (weather.hour > 24) ++ weather.hour = weather.hour - 24; ++ ++ if (!Metric) ++ weather.temp = (weather.temp * 9) / 5 + 32; ++ } ++ ++ // set next alarm ++ signal(SIGALRM, UpdateData); ++ /* Set an alarm to go off in a little while. */ ++ alarm(UpdateDelay); ++ ++ Repaint(); ++} ++ ++char *GetTempDir(char *suffix) { ++ uid_t id; ++ struct passwd *userEntry; ++ static char userHome[128]; ++ ++ id = getuid(); ++ userEntry = getpwuid(id); ++ snprintf(userHome, 128, "%s/%s", userEntry->pw_dir, suffix); ++ return userHome; ++} ++ ++char *StringToUpper(char *String) { ++ ++ int i; ++ ++ for (i = 0; i < strlen(String); i++) ++ String[i] = toupper(String[i]); ++ ++ return String; ++} ++ ++char *mystrsep(char **stringp, char *delim) { ++ char *start = *stringp; ++ char *cp; ++ char ch; ++ if (start == NULL) ++ return NULL; ++ for (cp = start; (ch = *cp) != 0; cp++) { ++ if (strchr(delim, ch)) { ++ *cp++ = 0; ++ *stringp = cp; ++ return start; ++ } ++ } ++ *stringp = NULL; ++ return start; ++} diff --git a/weather.pl-new-line-skip.patch b/weather.pl-new-line-skip.patch new file mode 100644 index 000000000000..a2e983e760cc --- /dev/null +++ b/weather.pl-new-line-skip.patch @@ -0,0 +1,20 @@ +Description: New line skip in weather.pl. + Previously, there were 12 lines between the "START BODY OF TEXT HERE" comment + and the time in the html file downloaded from weather.noaa.gov for processing + weather information. Now, however, the number of lines has increased to 21, + and weather.pl was not able to correctly parse the weather information. + . + This patch fixes this issue. +Author: Doug Torrance <dtorrance@monmouthcollege.edu> + +--- wmfrog-0.3.1.orig/Src/weather.pl ++++ wmfrog-0.3.1/Src/weather.pl +@@ -40,7 +40,7 @@ if($mode eq "http") + $line=<DATA>; + } + $i=0; +- while($i!=12 && !eof(DATA)) ++ while($i!=21 && !eof(DATA)) + { + $line=<DATA>; + $i++; diff --git a/wmfrog.1.pod b/wmfrog.1.pod new file mode 100644 index 000000000000..b5f1334d32b5 --- /dev/null +++ b/wmfrog.1.pod @@ -0,0 +1,109 @@ +Rxu# This is manual page in Perl POD format. Read more at +# http://perldoc.perl.org/perlpod.html or run command: +# +# perldoc perlpod | less +# +# To check the syntax: +# +# podchecker *.pod +# +# Create manual page with command: +# +# pod2man PAGE.N.pod > PAGE.N + +=pod + +=head1 NAME + +wmfrog - a dockapp for showing weather in graphical way + +=head1 SYNOPSIS + + wmfrog [options] -stattion <METAR station id> + +=head1 OPTIONS + +=over 4 + +=item B<-delay minutes> + +Override time (in minutes) between updates. Default is 15. + +=item B<-m, -metric> + +Display Temperature in metric unit: Celcius. + +=item B<-o offset> + +Time offset of location from UTC. Positive or negative integer +expressed in hours, like +1 or -7. + +=item B<-s, -station> + +Required option. The 4-character METAR Station ID. See +http://en.wikipedia.org/wiki/METAR + +=item B<-w knots> + +Set the maximum wind in KNOTS for percentage of max / scaling. Default +is 50 Knots. + +=item B<-tmp directory> + +Set the temporary directory where the METAR data files are downloaded +Default is C</tmp>. + +=item B<-l label> + +Set displayed text to 4 character (max) label to replace the METAR +station id. + +=back + +=head1 DESCRIPTION + +A dockapp for weather reports. Includes clouds (clear, few, +scattered, broken, overcast ...); Precipitations (drizzle, rain, snow, +ice christals: light/moderate or heavy); Special weather (Blowing wind +/ Freezing / Thunderstorm, funnel cloud...); Humidity perentage; Wind +speed (average & gust); Wind Direction; Temperature (Celcius or +Fareinheit); Station name can be configured and weather report time is +displayed. + +To find out more about the METAR/TAF system, see +I<Frequently Asked Questions about METAR/SPECI and TAF> at +http://www.nws.noaa.gov/oso/oso1/oso12/faq.htm + +To find your city Metar code go to NOAA's Meteorological Station +Information Lookup page I<Meteorological Products Processed At The +NWSTG> at at http://www.nws.noaa.gov/tg/siteloc.php + +=head1 ENVIRONMENT + +None. + +=head1 FILES + +=over 4 + +=item /tmp/<station-id>/ + +Stored data files. The directory can be changed with option B<-tmp> + +=back + +=head1 SEE ALSO + +wmweather(1) +wmweather+(1) + +=head1 AUTHORS + +program was written by Thibaut Colar <tcolar@users.sourceforge.net> + +This manual page is based on 0.1.6 version of the program. Updated by Jari +Aalto <jari.aalto@cante.net>. Released under license GNU GPL v2 or (at +your option) any later version. For more information about license, visit +<http://www.gnu.org/copyleft/gpl.html>. + +=cut |