/*       mysql2300.c
 *
 *       Version 1.3 - open2300 1.10
 *
 *       Get data from WS2300 weather station
 *       and add them to MySQL database
 *
 *       Copyright 2003,2004, Kenneth Lavrsen/Thomas Grieder
 *
 *       This program is published under the GNU General Public license
 *
 *  0.1  2004 Feb 21  Thomas Grieder
 *       Creates mysql2300. A Rewrite of log2300.
 *       Logline is now comma delimited for added support to write
 *       to MySQL
 *       (see also http://www.unixreview.com/documents/s=8989/ur0401a/)
 *
 *  1.2  2004 Mar 07  Kenneth Lavrsen
 *       Complete rewrite of the code to support the new rw2300 library.
 *       Logfile feature removed to make it a clean MySQL program.
 *       Added support for config file and program should be able to
 *       compile under Windows with the right MySQL client headers
 *       and libraries installed.
 *
 *  1.3  As 1.2
 *
 *  1.4  2009 Aout 31 Thomas Guenneguez
 *       Include import off dll for windows use.
 */

#include <mysql.h>
#include "rw2300.h"

 
/********** MAIN PROGRAM ************************************************
 *
 * This program reads current weather data from a WS2300
 * and writes the data to a MySQL database.
 *
 * The open2300.conf config file must contain the following parameters
 * 
 * Table structure for table `weather`
 * 
   CREATE TABLE `weather` (
     `timestamp` bigint(14) NOT NULL default '0',
     `rec_date` date NOT NULL default '0000-00-00',
     `rec_time` time NOT NULL default '00:00:00',
     `temp_in` decimal(2,1) NOT NULL default '0.0',
     `temp_out` decimal(2,1) NOT NULL default '0.0',
     `dewpoint` decimal(2,1) NOT NULL default '0.0',
     `rel_hum_in` tinyint(3) NOT NULL default '0',
     `rel_hum_out` tinyint(3) NOT NULL default '0',
     `windspeed` decimal(3,1) NOT NULL default '0.0',
     `wind_angle` decimal(3,1) NOT NULL default '0.0',
     `wind_direction` char(3) NOT NULL default '',
     `wind_chill` decimal(2,1) NOT NULL default '0.0',
     `rain_1h` decimal(3,1) NOT NULL default '0.0',
     `rain_24h` decimal(3,1) NOT NULL default '0.0',
     `rain_total` decimal(4,1) NOT NULL default '0.0',
     `rel_pressure` decimal(4,1) NOT NULL default '0.0',
     `tendency` varchar(7) NOT NULL default '',
     `forecast` varchar(6) NOT NULL default '',
     UNIQUE KEY `timestamp` (`timestamp`)
   ) TYPE=MyISAM;
 *
 * It takes one parameters. 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;
	MYSQL mysql;
	unsigned char logline[3000] = "";
	char datestring[50];       //used to hold the date stamp for the log file
	const char *directions[]= {"N","NNE","NE","ENE","E","ESE","SE","SSE",
	                           "S","SSW","SW","WSW","W","WNW","NW","NNW"};
	double winddir[6];
	int tempint;
	char tendency[15];
	char forecast[15];
	struct config_type config;
	time_t basictime;
	char query[4096];

#ifdef WIN32
	HMODULE hinstDLL;
	typedef int(__stdcall *MYSQL_INIT)(MYSQL *mysql);
	typedef int(__stdcall *MYSQL_REAL_CONNECT)(MYSQL *mysql, const char *host,
					   const char *user,
					   const char *passwd,
					   const char *db,
					   unsigned int port,
					   const char *unix_socket,
					   unsigned long clientflag);
	typedef int(__stdcall *MYSQL_ERRNO)(MYSQL *mysql);
	typedef char *(__stdcall *MYSQL_ERROR)(MYSQL *mysql);
	typedef int(__stdcall *MYSQL_QUERY)(MYSQL *mysql, const char *q);
	typedef int(__stdcall *MYSQL_CLOSE)(MYSQL *sock);

	MYSQL_INIT mysql_init;
	MYSQL_REAL_CONNECT mysql_real_connect;
	MYSQL_ERRNO mysql_errno;
	MYSQL_ERROR mysql_error;
	MYSQL_QUERY mysql_query;
	MYSQL_CLOSE mysql_close;
#endif

	get_configuration(&config, argv[1]);

	ws2300 = open_weatherstation(config.serial_device_name);


	/* READ TEMPERATURE INDOOR */

	sprintf(logline,"%s\'%.1f\',", logline,
	        temperature_indoor(ws2300, config.temperature_conv) );
	

	/* READ TEMPERATURE OUTDOOR */

	sprintf(logline,"%s\'%.1f\',", logline,
	        temperature_outdoor(ws2300, config.temperature_conv) );
	

	/* READ DEWPOINT */

	sprintf(logline,"%s\'%.1f\',", logline,
	        dewpoint(ws2300, config.temperature_conv) );
	

	/* READ RELATIVE HUMIDITY INDOOR */

	sprintf(logline,"%s\'%d\',", logline, humidity_indoor(ws2300) );
	
	
	/* READ RELATIVE HUMIDITY OUTDOOR */

	sprintf(logline,"%s\'%d\',", logline, humidity_outdoor(ws2300) );


	/* READ WIND SPEED AND DIRECTION aND WINDCHILL */

	sprintf(logline,"%s\'%.1f\',", logline,
	        wind_all(ws2300, config.wind_speed_conv_factor,
	                 &tempint, winddir) );

	sprintf(logline,"%s\'%.1f\',\'%s\',", logline,
	        winddir[0], directions[tempint]);
	

	/* READ WINDCHILL */

	sprintf(logline,"%s\'%.1f\',", logline,
	        windchill(ws2300, config.temperature_conv) );

	
	/* READ RAIN 1H */

	sprintf(logline,"%s\'%.1f\',", logline,
	        rain_1h(ws2300, config.rain_conv_factor) );
	
	
	/* READ RAIN 24H */

	sprintf(logline,"%s\'%.1f\',", logline,
	        rain_24h(ws2300, config.rain_conv_factor) );

	
	/* READ RAIN TOTAL */

	sprintf(logline,"%s\'%.1f\',", logline,
	        rain_total(ws2300, config.rain_conv_factor) );

	
	/* READ RELATIVE PRESSURE */

	sprintf(logline,"%s\'%.1f\',", logline,	
	        rel_pressure(ws2300, config.pressure_conv_factor) );


	/* READ TENDENCY AND FORECAST */
	
	tendency_forecast(ws2300, tendency, forecast);
	sprintf(logline,"%s\'%s\',\'%s\'", logline, tendency, forecast);


	/* GET DATE AND TIME FOR LOG FILE, PLACE BEFORE ALL DATA IN LOG LINE */
	
	time(&basictime);
	strftime(datestring,sizeof(datestring),
	         "\'%Y%m%d%H%M%S\',\'%Y-%m-%d\',\'%H:%M:%S\'",
	         localtime(&basictime) );

	/* CLOSE THE WEATHER STATION TO ENABLE OTHER PROGRAMS TO ACCESS */
	close_weatherstation(ws2300);

	printf("%s %s\n",datestring, logline);  //disabled to be used in cron job

	/* INIT MYSQL AND CONNECT */
#ifdef WIN32
	if ((hinstDLL=LoadLibrary("libmysql.dll")))
	{
        mysql_init = GetProcAddress(hinstDLL, "mysql_init");
        mysql_errno = GetProcAddress(hinstDLL, "mysql_errno");
		mysql_error = GetProcAddress(hinstDLL, "mysql_error");
        mysql_close = GetProcAddress(hinstDLL, "mysql_close");
        mysql_real_connect = GetProcAddress(hinstDLL, "mysql_real_connect");
        mysql_query = GetProcAddress(hinstDLL, "mysql_query");
#endif
	if(!mysql_init(&mysql))
	{
	fprintf(stderr, "Cannot initialize MySQL");
	exit(0);
	}

	if(!mysql_real_connect(&mysql, config.mysql_host, config.mysql_user,
	                       config.mysql_passwd, config.mysql_database,
	                       config.mysql_port, NULL, 0))
	{
		fprintf(stderr, "%d: %s \n",
		mysql_errno(&mysql),
		mysql_error(&mysql));
		exit(0);
	}

	sprintf(query, "INSERT INTO weather VALUES (%s, %s)", datestring, logline);

	if(mysql_query(&mysql, query))
	{
		fprintf(stderr, "Could not insert row. %s %d: %s \n", query, mysql_errno(&mysql), mysql_error(&mysql));
		mysql_close(&mysql);
		exit(0);
	}

	mysql_close(&mysql);

 #ifdef WIN32
       FreeLibrary(hinstDLL);
    }
	else
	{
	fprintf(stderr, "Dll introuvable");
	}
#endif
	return(0);
}
