-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcw2300.c
121 lines (100 loc) · 4.23 KB
/
cw2300.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* open2300 - cw2300.c
*
* Version 1.11
*
* Send WS2300 weather station data to CWOP
* (Citizen Weather Observation Program)
*
* Copyright 2004, Kenneth Lavrsen/Randy Miller
* This program is published under the GNU General Public license
*
* Update History:
* 1.0 2004 Feb 02 Randy Miller Inital release
* (N6ABM) based on WU2300 v 1.0.
* Introduced also the config file
*
* 1.2 2004 Mar 07 Kenneth Lavrsen Completely re-written to match
* (OZ1IDD) rw2300 v 1.2 and made Windows
* compatible.
*
* 1.3 2006 Jun 19 Kenneth Lavrsen Rewritten to use safer strcat instead
* of sprintf over itself which may
* not always work.
*/
#include "rw2300.h"
#define CW_SOFTWARETYPE "open2300v"
#define DEBUG 0 // wu2300 stops writing to standard out if setting this to 0
/********** MAIN PROGRAM ************************************************
*
* This program reads data from a WS2300 weather station formats and
* sends it to Citizens Weather Observer Program (CWOP)
*
* It takes one parameter which is the config file name with path
* If this parameter is omitted the program will look at the default paths
* See the open2300.conf-dist file for info
*
***********************************************************************/
int main(int argc, char *argv[])
{
WEATHERSTATION ws2300;
char aprsline[3000] = "";
char tempstring[1000] = "";
char datestring[50]; //used to hold the date stamp for the log file
time_t basictime;
struct config_type config;
double tempfloat1, tempfloat2;
get_configuration(&config, argv[1]);
/* Setup serial port to weather station */
if ( (ws2300 = open_weatherstation(config.serial_device_name)) < 0 )
{
printf("Cannot open serial device %s\n",config.serial_device_name);
exit(-1);
}
/* GET DATE AND TIME FOR the WX record in UTC */
time(&basictime);
basictime = basictime - atof(config.timezone) * 60 * 60;
strftime(datestring, sizeof(datestring), "@%d%H%Mz",localtime(&basictime));
/* BUILD THE DATA STRING, START WITH URL, ID AND PASSWORD */
sprintf(aprsline, "%s>APRS,TCPXX*,qAX,%s:%s%s/%s",
config.citizen_weather_id, config.citizen_weather_id, // Build weather record
datestring, // Add date time
config.citizen_weather_latitude, config.citizen_weather_longitude); // Add Lat Lon
/* READ WIND DIRECTION (_) AND SPEED (/) - wind data must be mph for CWOP */
tempfloat1 = wind_current(ws2300, MILES_PER_HOUR, &tempfloat2); // Fetch current wind data
sprintf(tempstring,"_%03.0f/%03.0f", tempfloat2, tempfloat1); // _wind dir degrees/wind speed mph
strcat(aprsline, tempstring);
/* WIND GUST */
/* This requires that you reset the station regularly */
/* Uncomment the two lines below to activate wind gust */
// sprintf(aprsline, "%sg%03.0f", aprsline,
// wind_minmax(ws2300, MILES_PER_HOUR, NULL, NULL, NULL, NULL));
/* READ TEMPERATURE OUTDOOR t - Force deg F for CWOP */
sprintf(tempstring, "t%03.0f", temperature_outdoor(ws2300, FAHRENHEIT));
strcat(aprsline, tempstring);
/* READ RAIN 1H r - force inches for CWOP*/
sprintf(tempstring,"r%03.0f", rain_1h(ws2300, INCHES) *100); // hundredths of an inch
strcat(aprsline, tempstring);
/* READ RAIN 24H p */
sprintf(tempstring,"p%03.0f", rain_24h(ws2300, INCHES) *100); // hundredths of an inch
strcat(aprsline, tempstring);
/* RAIN SINCE MIDNIGHT P */
// not directly readable in LaCrosse
/* READ RELATIVE HUMIDITY OUTDOOR */
sprintf(tempstring, "h%02d", humidity_outdoor(ws2300));
strcat(aprsline, tempstring);
/* READ BAROMETRIC PRESSURE b */
sprintf(tempstring,"b%05.0f", (rel_pressure(ws2300, MILLIBARS) *10)); // tenths of milibars
strcat(aprsline, tempstring);
/* ADD SOFTWARE TYPE AND ACTION */
sprintf(tempstring,".%s%s", CW_SOFTWARETYPE, VERSION);
strcat(aprsline, tempstring);
/* MAKE WEATHER STATION AVAILABLE FOR OTHER PROGRAMS */
close_weatherstation(ws2300);
/* CONNECT TO SERVER AND SEND THE RECORD */
if (citizen_weather_send(&config, aprsline) != 0)
{
perror("Could not send data to Citizen Weather!\n");
exit(-1);
}
return(0);
}