wm918.java
Created with JBuilder
package awtweather;

import java.util.Date;
import java.io.*;
//==import javax.comm.*;
import java.net.*;

/**
 * Title:        Weather Monitor
 * Description:  This application will read weather data from an Oregon Scientific wm918 and display it in a window
 * Copyright:    Copyright (c) 2000
 * Company:      Holiwill
 * @author David Rose
 * @version 1.0
 */

public class wm918 extends Thread {

  public static final int INPUTFILE = 0;
  public static final int INPUTPORT = 1;
  public static final int INPUTSOCKET = 2;

  private boolean Debugging = false;

  private boolean Metric = true;                                // true=metric units, false = imperial
  private int buffer[] = new int[128];                          // raw data from wm918 goes here
  private int inputType;                                        // 0=file, 1=serial, 2=metwork
  private File inputFile = null;                                // file object
  //==private SerialPort inputPort = null;                          // serial port object
  private Socket inputSocket = null;                            // input socket object
  private FileInputStream inF = null;                           // input stream object
  private InputStream inP = null;
  private DataInputStream inS = null;

  // current readings
  private Date DateTime = new Date();
  private int TemperatureIn, TemperatureOut;              		// 0.0-50.0C
  private int TemperatureFormat;                                // 0=C or 1=F
  private int HumidityIn, HumidityOut;                    		// 10-97%
  private int BarometerLocal, BarometerSea;               		// 795-1050mb
  private int Trend, Prediction;        		                // 1,2,4 1,2,4,8
  private int BarometerFormat;					               	// 0=in, 1=mm, 2=mb, 3=hpa
  private int DewpointIn, DewpointOut;				        	// 0-47C
  private int WindDirection, WindSpeed;                   		// 0-359deg, 0.0-56.0ms
  private int GustDirection, GustSpeed;                   		// 0-359deg, 0.0-56.0ms
  private int Windchill;					                	// -85-60C
  private int WindFormat;						               	// 0=mph, 1=knots, 2=m/s, 3=kph
  private int RainToday, RainRate;                        		// 0-9999mm, 0-998mm/hr
  private int RainYesterday;                              		// 0-9999mm, 0-998mm/hr
  private int RainTotal;                                  		// 0-9999mm, 0-998mm/hr
  private int RainFormat;				                		// 0=mm, 1=in
  private int Battery;						                	// 0=battery OK, 1=battery low
  private int Power;			                             	// 0=AC, 1=DC

  // minimum readings
  private Date minTemperatureInDateTime = new Date();
  private Date minTemperatureOutDateTime = new Date();
  private Date minHumidityInDateTime = new Date();
  private Date minHumidityOutDateTime = new Date();
  private Date minDewpointInDateTime = new Date();
  private Date minDewpointOutDateTime = new Date();
  private Date minWindSpeedDateTime = new Date();
  private Date minWindchillDateTime = new Date();
  private int minTemperatureIn, minTemperatureOut;             	// 0.0-50.0C
  private int minHumidityIn, minHumidityOut;                   	// 10-97%
  private int minBarometerLocal, minBarometerSea;              	// 795-1050mb
  private int minDewpointIn, minDewpointOut;				    // 0-47C
  private int minWindDirection, minWindSpeed;                   // 0-359deg, 0.0-56.0ms
  private int minGustDirection, minGustSpeed;                   // 0-359deg, 0.0-56.0ms
  private int minWindchill;						                // -85-60C

  // maximum readings
  private Date maxTemperatureInDateTime = new Date();
  private Date maxTemperatureOutDateTime = new Date();
  private Date maxHumidityInDateTime = new Date();
  private Date maxHumidityOutDateTime = new Date();
  private Date maxDewpointInDateTime = new Date();
  private Date maxDewpointOutDateTime = new Date();
  private Date maxWindDateTime = new Date();
  private Date maxWindchillDateTime = new Date();
  private int maxTemperatureIn, maxTemperatureOut;              // 0.0-50.0C
  private int maxHumidityIn, maxHumidityOut;                    // 10-97%
  private int maxBarometerLocal, maxBarometerSea;               // 795-1050mb
  private int maxDewpointIn, maxDewpointOut;				    // 0-47C
  private int maxWindDirection, maxWindSpeed;                   // 0-359deg, 0.0-56.0ms
  private int maxGustDirection, maxGustSpeed;                   // 0-359deg, 0.0-56.0ms
  private int maxWindchill;						                // -85-60C

  private String[] Predictions  = {"Sunny", "Cloudy", "Partly Cloudy", "Rain", "Unknown"};  //1,2,4,8
  private String[] Trends       = {"Rising", "Steady", "Falling", "Unknown"};               //1,2,4
  private String[] Directions =   {" N ", "NNE", "NE ", "ENE", " E ", "ESE", "SE ", "SSE",
								   " S ", "SSW", "SW ", "WSW", " W ", "WNW", "NW ", "NNW"};

  private int[] lengths = { 0, 0, 0, 0, 0, 0, 0, 0, 35, 34, 31, 14, 27, 0, 0, 5 };

  public wm918(String fileName, int fileType)
  {
	  //DateTime = 0;
		TemperatureIn = 0; TemperatureOut = 0;
		HumidityIn = 0; HumidityOut = 0;
		BarometerLocal = 0; BarometerSea = 0;
		Trend = 0; Prediction = 0;
		BarometerFormat = 0;
		WindDirection = 0; WindSpeed = 0;
		GustDirection = 0; GustSpeed = 0;
		RainToday = 0; RainRate = 0;

		inputType = fileType;
		switch(inputType)
		{
			case INPUTFILE:
				try
				{
				inputFile = new File(fileName);
				inF = new FileInputStream(inputFile);
				} catch (Exception e)
				{
					System.out.println("file error");
					e.printStackTrace();
				}
				break;
			case INPUTPORT:
//			   try
//			   {
//					CommPortIdentifier portID = CommPortIdentifier.getPortIdentifier(fileName);
//					inputPort = (SerialPort) portID.open("WeatherMonitor", 2000);
//					inputPort.setSerialPortParams(9600, 8, 1, 0);
//					inP = inputPort.getInputStream();
//			   } catch (Exception e)
//			   {
//					System.out.println("port error");
//					e.printStackTrace();
//			   }
//			   break;
			case INPUTSOCKET:
				try
				{
					InetAddress addr = InetAddress.getByName(fileName);
					inputSocket = new Socket(addr, 9753);
					inS = new DataInputStream(inputSocket.getInputStream());
					inputSocket.setSoTimeout(20000);  // Twenty-second timeout
				} catch (IOException e)
				{
					System.out.println("socket error");
					e.printStackTrace();
				}
				break;
		}
  }

  public void run()
  {
	int c, length, pos;

	while(true)
	{
		c = 0;
		try
		{
			switch(inputType)
			{
				case INPUTFILE:
					c = inF.read();
					break;
				case INPUTPORT:
					c = inP.read();
					break;
				case INPUTSOCKET:
					c = inS.read();
			}
	   } catch (Exception e)
	   {
			System.out.println("read error");
			e.printStackTrace();
	   }

		int p = c >> 4;
		length = lengths[p];
		buffer[0] = c & 0x0ff;
		if(Debugging) System.out.print(" " + Integer.toHexString(c));
		pos = 1;
		while (pos < length)
		{
			try
			{
				switch(inputType)
				{
					case INPUTFILE:
						c = inF.read();
						break;
					case INPUTPORT:
						c = inP.read();
						break;
					case INPUTSOCKET:
						c = inS.read();
				}
			   } catch (Exception e)
			   {
					System.out.println("read error");
					e.printStackTrace();
			   }

		  buffer[pos++] = c & 0x0ff;
		  if(Debugging) System.out.print(" " + Integer.toHexString(c));
		}
		if(Debugging) System.out.println("");

	//todo: verify checksum

		switch (buffer[0])              // branch off to the appropriate handler
		{
		  case 0x8f:                    // Humidity
		  case 0xff:                    // Date-Time Stamp
			get8f();
			break;
		  case 0x9f:                    // Temperature
			get9f();
			break;
		  case 0xaf:                    // Barometer, Dewpoint
			getaf();
			break;
		  case 0xbf:                    // Rain
			getbf();
			break;
		  case 0xcf:                    // Wind, Windchill
			getcf();
			break;
		}
	}
  }

//  public void stop()
//  {
//	try
//	{
//		switch(inputType)
//		{
//			case INPUTFILE:
//				inF.close();
//			case INPUTPORT:
//				inP.close();
//			case INPUTSOCKET:
//				inS.close();
//		}
//	} catch (Exception e)
//	{
//		System.out.println("close error");
//		e.printStackTrace();
//	}
//  }

   public void get8f()   // extract humidity
  {
	int ab, ab0, ab1;
	int a,b;

	ab = buffer[1];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int Sec = a * 10 + b;

	ab = buffer[2];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int Min = a * 10 + b;

	ab = buffer[3];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int Hour = a * 10 + b;

	if (buffer[0] != 0x8f)
	{
		DateTime.setSeconds(Sec);
		DateTime.setMinutes(Min);
		DateTime.setHours(Hour);
		if(Debugging) System.out.println("    time:" + DateTime);
		return;
	}

	ab = buffer[4];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int Day = a * 10 + b;

	ab = buffer[5];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int Mon = b;

	DateTime.setSeconds(Sec);
	DateTime.setMinutes(Min);
	DateTime.setHours(Hour);
	DateTime.setDate(Day);
	DateTime.setMonth(Mon - 1);

	ab = buffer[8];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	HumidityIn = a * 10 + b;

	ab = buffer[20];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	HumidityOut = a * 10 + b;

	ab = buffer[9];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	maxHumidityIn = a * 10 + b;

	ab = buffer[10];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityInMin = a * 10 + b;

	ab = buffer[11];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityInHour = a * 10 + b;

	ab = buffer[12];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityInDay = a * 10 + b;

	ab0 = buffer[13];
	ab1 = buffer[14];
	a = ab0 & 0x0f;
	int maxHumidityInMon = a;

	maxHumidityInDateTime.setMinutes(maxHumidityInMin);
	maxHumidityInDateTime.setHours(maxHumidityInHour);
	maxHumidityInDateTime.setDate(maxHumidityInDay);
	maxHumidityInDateTime.setMonth(maxHumidityInMon - 1);

	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	minHumidityIn = a * 10 + b;

	ab0 = buffer[14];
	ab1 = buffer[15];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityInMin = a * 10 + b;

	ab0 = buffer[15];
	ab1 = buffer[16];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityInHour = a * 10 + b;

	ab0 = buffer[16];
	ab1 = buffer[17];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityInDay = a * 10 + b;

	ab = buffer[17];
	a = ab >> 4 & 0x0f;
	int minHumidityInMon = a;

	minHumidityInDateTime.setMinutes(minHumidityInMin);
	minHumidityInDateTime.setHours(minHumidityInHour);
	minHumidityInDateTime.setDate(minHumidityInDay);
	minHumidityInDateTime.setMonth(minHumidityInMon - 1);

	ab = buffer[21];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	maxHumidityOut = a * 10 + b;

	ab = buffer[22];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityOutMin = a * 10 + b;

	ab = buffer[23];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityOutHour = a * 10 + b;

	ab = buffer[24];
	a = a >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxHumidityOutDay = a * 10 + b;

	ab = buffer[25];
	b = ab & 0x0f;
	int maxHumidityOutMon = b;

	maxHumidityOutDateTime.setMinutes(maxHumidityOutMin);
	maxHumidityOutDateTime.setHours(maxHumidityOutHour);
	maxHumidityOutDateTime.setDate(maxHumidityOutDay);
	maxHumidityOutDateTime.setMonth(maxHumidityOutMon - 1);

	ab0 = buffer[25];
	ab1 = buffer[26];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	minHumidityOut = a * 10 + b;

	ab0 = buffer[26];
	ab1 = buffer[27];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityOutMin = a * 10 + b;

	ab0 = buffer[27];
	ab1 = buffer[28];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityOutHour = a * 10 + b;

	ab0 = buffer[28];
	ab1 = buffer[29];
	b = ab0 >> 4 & 0x0f;
	a = ab1 & 0x0f;
	int minHumidityOutDay = a * 10 + b;

	ab = buffer[29];
	a = ab >> 4 & 0x0f;
	int minHumidityOutMon = a;

	minHumidityOutDateTime.setMinutes(minHumidityOutMin);
	minHumidityOutDateTime.setHours(minHumidityOutHour);
	minHumidityOutDateTime.setDate(minHumidityOutDay);
	minHumidityOutDateTime.setMonth(minHumidityOutMon - 1);

	if(Debugging) System.out.println("    time:" + DateTime + " HumidityIn:" + HumidityIn + " HumidityOut:" + HumidityOut);
	if(Debugging) System.out.println("min time:" + minHumidityInDateTime + " HumidityIn:" + minHumidityIn + " HumidityOut:" + minHumidityOut);
	if(Debugging) System.out.println("max time:" + maxHumidityInDateTime + " HumidityIn:" + maxHumidityIn + " HumidityOut:" + maxHumidityOut);
  }

  public void get9f()   // extract temperature
  {
	int a,b,c, sign;
	int ab, bc;

	bc = buffer[1];
	a = buffer[2];
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	TemperatureIn = (a * 100) + (b * 10) + c;
	if(sign == 8)
		TemperatureIn = -TemperatureIn;

	c = buffer[2];
	ab = buffer[3];
	c = c >> 4 & 0x0f;
	b = ab & 0x0f;
	a = ab >> 4 & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	maxTemperatureIn = (a * 100) + (b * 10) + c;
	if(sign == 8)
		maxTemperatureIn = -maxTemperatureIn;

	ab = buffer[4];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureInMin = a * 10 + b;

	ab = buffer[5];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureInHour = a * 10 + b;

	ab = buffer[6];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureInDay = a * 10 + b;

	ab = buffer[7];
	b = ab & 0x0f;
	int maxTemperatureInMon = b;

	maxTemperatureInDateTime.setMinutes(maxTemperatureInMin);
	maxTemperatureInDateTime.setHours(maxTemperatureInHour);
	maxTemperatureInDateTime.setDate(maxTemperatureInDay);
	maxTemperatureInDateTime.setMonth(maxTemperatureInMon - 1);

	c = buffer[7];
	ab = buffer[8];
	c = c >> 4 & 0x0f;
	b = ab & 0x0f;
	a = ab >> 4 & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	minTemperatureIn = (a * 100) + (b * 10) + c;
	if(sign == 8)
		minTemperatureIn = -minTemperatureIn;

	ab = buffer[9];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureInMin = a * 10 + b;

	ab = buffer[10];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureInHour = a * 10 + b;

	ab = buffer[11];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureInDay = a * 10 + b;

	ab = buffer[12];
	b = ab & 0x0f;
	int minTemperatureInMon = b;

	minTemperatureInDateTime.setMinutes(minTemperatureInMin);
	minTemperatureInDateTime.setHours(minTemperatureInHour);
	minTemperatureInDateTime.setDate(minTemperatureInDay);
	minTemperatureInDateTime.setMonth(minTemperatureInMon - 1);

	a = buffer[15];
	TemperatureFormat = (a >> 6) & 0x01;

	bc = buffer[16];
	a = buffer[17];
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	TemperatureOut = (a * 100) + (b * 10) + c;
	if(sign == 8)
		TemperatureOut = -TemperatureOut;

	ab = buffer[18];
	c = buffer[17];
	c = c >> 4 & 0x0f;
	b = ab & 0x0f;
	a = ab >> 4 & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	maxTemperatureOut = (a * 100) + (b * 10) + c;
	if(sign == 8)
		maxTemperatureOut = -maxTemperatureOut;

	ab = buffer[19];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureOutMin = a * 10 + b;

	ab = buffer[20];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureOutHour = a * 10 + b;

	ab = buffer[21];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxTemperatureOutDay = a * 10 + b;

	ab = buffer[22];
	b = ab & 0x0f;
	int maxTemperatureOutMon = b;

	maxTemperatureOutDateTime.setMinutes(maxTemperatureOutMin);
	maxTemperatureOutDateTime.setHours(maxTemperatureOutHour);
	maxTemperatureOutDateTime.setDate(maxTemperatureOutDay);
	maxTemperatureOutDateTime.setMonth(maxTemperatureOutMon - 1);

	c = buffer[22];
	ab = buffer[23];
	c = c >> 4 & 0x0f;
	b = ab & 0x0f;
	a = ab >> 4 & 0x0f;
	sign = a & 0x08;
	a = a & 0x07;
	minTemperatureOut = (a * 100) + (b * 10) + c;
	if(sign == 8)
		minTemperatureOut = -minTemperatureOut;

	ab = buffer[24];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureOutMin = a * 10 + b;

	ab = buffer[25];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureOutHour = a * 10 + b;

	ab = buffer[26];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minTemperatureOutDay = a * 10 + b;

	ab = buffer[27];
	b = ab & 0x0f;
	int minTemperatureOutMon = b;

	minTemperatureOutDateTime.setMinutes(minTemperatureOutMin);
	minTemperatureOutDateTime.setHours(minTemperatureOutHour);
	minTemperatureOutDateTime.setDate(minTemperatureOutDay);
	minTemperatureOutDateTime.setMonth(minTemperatureOutMon - 1);

	if(Debugging) System.out.println("    time:" + DateTime + " TemperatureIn:" + TemperatureIn + " TemperatureOut:" + TemperatureOut);
	if(Debugging) System.out.println("min time:" + minTemperatureInDateTime + " TemperatureIn:" + minTemperatureIn + " TemperatureOut:" + minTemperatureOut);
	if(Debugging) System.out.println("max time:" + maxTemperatureInDateTime + " TemperatureIn:" + maxTemperatureIn + " TemperatureOut:" + maxTemperatureOut);
  }

  public void getaf()   // extract barometer
  {
	int ab, bc, cd, de;
	int a, b, c, d;

	cd = buffer[1];
	ab = buffer[2];
	c = cd >> 4 & 0x0f;
	d = cd & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	BarometerLocal = a * 1000 + b * 100 + c * 10 + d;

	de = buffer[3];
	bc = buffer[4];
	a = buffer[5];
	d = de >> 4 & 0x0f;
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	a = a & 0x0f;
	BarometerSea = a * 1000 + b * 100 + c * 10 + d;

	ab = buffer[5];
	a = ab >> 4 & 0x0f;
	BarometerFormat = a & 0x03;

	ab = buffer[6];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	Trend = a & 0x07;
	Prediction = b;

	ab = buffer[7];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	DewpointIn = a * 10 + b;

	ab = buffer[8];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	maxDewpointIn = a * 10 + b;

	ab = buffer[9];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointInMin = a * 10 + b;

	ab = buffer[10];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointInHour = a * 10 + b;

	ab = buffer[11];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointInDay = a * 10 + b;

	ab = buffer[12];
	int maxDewpointInMon = ab & 0x0f;

	maxDewpointInDateTime.setMinutes(maxDewpointInMin);
	maxDewpointInDateTime.setHours(maxDewpointInHour);
	maxDewpointInDateTime.setDate(maxDewpointInDay);
	maxDewpointInDateTime.setMonth(maxDewpointInMon - 1);

	b = buffer[12];
	a = buffer[13];
	a = a >> 4 & 0x0f;
	b = b & 0x0f;
	minDewpointIn = a * 10 + b;

	b = buffer[13];
	a = buffer[14];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointInMin = a * 10 + b;

	b = buffer[14];
	a = buffer[15];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointInHour = a * 10 + b;

	b = buffer[15];
	a = buffer[16];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointInDay = a * 10 + b;

	a = buffer[16];
	a = a >> 4 & 0x0f;
	int minDewpointInMon = a;

	minDewpointInDateTime.setMinutes(minDewpointInMin);
	minDewpointInDateTime.setHours(minDewpointInHour);
	minDewpointInDateTime.setDate(minDewpointInDay);
	minDewpointInDateTime.setMonth(minDewpointInMon - 1);

	ab = buffer[18];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	DewpointOut = a * 10 + b;

	ab = buffer[19];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	maxDewpointOut = a * 10 + b;

	ab = buffer[20];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointOutMin = a * 10 + b;

	ab = buffer[21];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointOutHour = a * 10 + b;

	ab = buffer[22];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxDewpointOutDay = a * 10 + b;

	a = buffer[23];
	a = a & 0x0f;
	int maxDewpointOutMon = a;

	maxDewpointOutDateTime.setMinutes(maxDewpointOutMin);
	maxDewpointOutDateTime.setHours(maxDewpointOutHour);
	maxDewpointOutDateTime.setDate(maxDewpointOutDay);
	maxDewpointOutDateTime.setMonth(maxDewpointOutMon - 1);

	b = buffer[23];
	a = buffer[24];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	minDewpointOut = a * 10 + b;

	b = buffer[24];
	a = buffer[25];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointOutMin = a * 10 + b;

	b = buffer[25];
	a = buffer[26];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointOutHour = a * 10 + b;

	b = buffer[26];
	a = buffer[27];
	b = b >> 4 & 0x0f;
	a = a & 0x0f;
	int minDewpointOutDay = a * 10 + b;

	a = buffer[27];
	a = a >> 4 & 0x0f;
	int minDewpointOutMon = a;

	minDewpointOutDateTime.setMinutes(minDewpointOutMin);
	minDewpointOutDateTime.setHours(minDewpointOutHour);
	minDewpointOutDateTime.setDate(minDewpointOutDay);
	minDewpointOutDateTime.setMonth(minDewpointOutMon - 1);

	if(Debugging) System.out.println("BarometerLocal:" + BarometerLocal + " BarometerSea:" + BarometerSea + " BarometerFormat:" + BarometerFormat + " Trend:" + Trend + " Prediction:" + Prediction);
	if(Debugging) System.out.println("    time:" + DateTime + " DewpointIn:" + DewpointIn + " DewpointOut:" + DewpointOut);
	if(Debugging) System.out.println("min time:" + minDewpointInDateTime + " DewpointIn:" + minDewpointIn + " DewpointOut:" + minDewpointOut);
	if(Debugging) System.out.println("max time:" + maxDewpointInDateTime + " DewpointIn:" + maxDewpointIn + " DewpointOut:" + maxDewpointOut);
  }

  public void getbf()   // extract rain
  {
	int ab, bc, cd;
	int a, b, c, d;

	bc = buffer[1];
	a = buffer[2];
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	a = a & 0x0f;
	RainRate = a * 100 + b * 10 + c;

	cd = buffer[3];
	ab = buffer[4];
	c = cd >> 4 & 0x0f;
	d = cd & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	RainYesterday = a * 1000 + b * 100 + c * 10 + d;

	cd = buffer[5];
	ab = buffer[6];
	c = cd >> 4 & 0x0f;
	d = cd & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	RainTotal = a * 1000 + b * 100 + c * 10 + d;

	ab = buffer[7];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int RainResetMin = a * 10 + b;

	ab = buffer[8];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int RainResetHour = a * 10 + b;

	ab = buffer[9];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int RainResetDay = a * 10 + b;

	ab = buffer[10];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int RainResetMon = b;

	RainFormat = a & 0x02;

	if(Debugging) System.out.println("RainRate:" + RainRate + " RainYesterday:" + RainYesterday + " RainTotal:" + RainTotal + " RainFormat:" + RainFormat);
  }

  public void getcf()   // extract wind
  {
	int ab, bc, cd;
	int a, b, c, d;

	bc = buffer[1];
	a = buffer[2];
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	a = a & 0x0f;
	GustSpeed = a * 100 + b * 10 + c;

	c = buffer[2];
	ab = buffer[3];
	c = c >> 4 & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	GustDirection = a * 100 + b * 10 + c;

	bc = buffer[4];
	a = buffer[5];
	a = a & 0x0f;
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	WindSpeed = a * 100 + b * 10 + c;

	c = buffer[5];
	ab = buffer[6];
	c = c >> 4 & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	WindDirection = a * 100 + b * 10 + c;

	bc = buffer[7];
	a = buffer[8];
	b = bc >> 4 & 0x0f;
	c = bc & 0x0f;
	a = a & 0x0f;
	maxWindSpeed = a * 100 + b * 10 + c;

	c = buffer[8];
	ab = buffer[9];
	c = c >> 4 & 0x0f;
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	maxWindDirection = a * 100 + b * 10 + c;

	ab = buffer[11];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxWindHour = a * 10 + b;

	ab = buffer[10];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxWindMin = a * 10 + b;

	ab = buffer[12];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int maxWindDay = a * 10 + b;

	ab = buffer[13];
	int maxWindMon = ab & 0x0f;

	maxWindDateTime.setMinutes(maxWindMin);
	maxWindDateTime.setHours(maxWindHour);
	maxWindDateTime.setDate(maxWindDay);
	maxWindDateTime.setMonth(maxWindMon - 1);

	ab = buffer[15];
	a = ab >> 4 & 0x0f;
	WindFormat = a & 0x06;

	ab = buffer[16];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	Windchill = a * 10 + b;

	ab = buffer[17];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	minWindchill = a * 10 + b;

	ab = buffer[18];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minWindchillMin = a * 10 + b;

	ab = buffer[19];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minWindchillHour = a * 10 + b;

	ab = buffer[20];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	int minWindchillDay = a * 10 + b;

	ab = buffer[21];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	if ((a & 0x01) == 0x01)
	  Windchill = -Windchill;
	if ((a & 0x02) == 0x02)
	  minWindchill = -minWindchill;

	int minWindchillMon = b;

	minWindchillDateTime.setMinutes(minWindchillMin);
	minWindchillDateTime.setHours(minWindchillHour);
	minWindchillDateTime.setDate(minWindchillDay);
	minWindchillDateTime.setMonth(minWindchillMon - 1);

	ab = buffer[23];
	a = ab >> 4 & 0x0f;
	b = ab & 0x0f;
	Battery = a >> 4;
	Power = a  >> 3;
	if(Debugging) System.out.println("min time:" + minWindchillDateTime + " Windchill:" + minWindchill);
	if(Debugging) System.out.println("max time:" + maxWindDateTime + " WindSpeed:" + maxWindSpeed + " WindDirection:" + maxWindDirection);
	if(Debugging) System.out.println("GustSpeed:" + GustSpeed + " GustDirection:" + GustDirection + " WindSpeed:" + WindSpeed + " WindDirection:" + WindDirection);
	if(Debugging) System.out.println("Power:" + Power + " Battery:" + Battery);
  }

  public Date getDateTime()
  {
	return DateTime;
  }
  public float getTemperatureIn()
  {
	return ((float) TemperatureIn) / 10.0f;
  }
  public float getTemperatureOut()
  {
	return ((float) TemperatureOut) / 10.0f;
  }
  public int getHumidityIn()
  {
	return HumidityIn;
  }
  public int getHumidityOut()
  {
	return HumidityOut;
  }
  public int getBarometerLocal()
  {
	return BarometerLocal;
  }
  public int getBarometerSea()
  {
	return BarometerSea;
  }
  public String getTrend()
  {
	switch (Trend)
	{
	  case 1:
		return Trends[0];
		//break;
	  case 2:
		return Trends[1];
		//break;
	  case 4:
		return Trends[2];
		//break;
	  default:
		return Trends[3];
		//break;
	  }
  }
  public String getPrediction()
  {
	switch (Prediction)
	{
	  case 1:
		return Predictions[0];
		//break;
	  case 2:
		return Predictions[1];
		//break;
	  case 4:
		return Predictions[2];
		//break;
	  case 8:
		return Predictions[3];
		//break;
	  default:
		return Predictions[4];
		//break;
	  }
  }
  public int getWindDirection()
  {
	return WindDirection;
  }
  public String getWindCompass()
  {
	return Directions[WindDirection / (360 / 16)];
  }
  public float getWindSpeed()
  {
	return ((float) WindSpeed) / 10.0f;
  }
  public int getGustDirection()
  {
	return GustDirection;
  }
  public String getGustCompass()
  {
	return Directions[GustDirection / (360 / 16)];
  }
  public float getGustSpeed()
  {
	return ((float) GustSpeed) / 10.0f;
  }
  public int getRainToday()
  {
	return RainToday;
  }
  public int getRainRate()
  {
	return RainRate;
  }
  public int getRainYesterday()
  {
	return RainYesterday;
  }
  public int getRainTotal()
  {
	return RainTotal;
  }
  public float getminTemperatureIn()
  {
	return ((float) minTemperatureIn) / 10.0f;
  }
  public float getminTemperatureOut()
  {
	return ((float) minTemperatureOut) / 10.0f;
  }
  public int getminHumidityIn()
  {
	return minHumidityIn;
  }
  public int getminHumidityOut()
  {
	return minHumidityOut;
  }
  public int getminBarometerLocal()
  {
	return minBarometerLocal;
  }
  public int getminBarometerSea()
  {
	return minBarometerSea;
  }
  public int getminWindDirection()
  {
	return minWindDirection;
  }
  public String getminWindCompass()
  {
	return Directions[minWindDirection / (360 / 16)];
  }
  public float getminWindSpeed()
  {
	return ((float) minWindSpeed) / 10.0f;
  }
  public int getminGustDirection()
  {
	return minGustDirection;
  }
  public String getminGustCompass()
  {
	return Directions[minGustDirection / (360 / 16)];
  }
  public float getminGustSpeed()
  {
	return ((float) minGustSpeed) / 10.0f;
  }
  public float getmaxTemperatureIn()
  {
	return ((float) maxTemperatureIn) / 10.0f;
  }
  public float getmaxTemperatureOut()
  {
	return ((float) maxTemperatureOut) / 10.0f;
  }
  public int getmaxHumidityIn()
  {
	return maxHumidityIn;
  }
  public int getmaxHumidityOut()
  {
	return