Rev 5 | Rev 8 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
* (C) Copyright 2011 by Andreas Theofilu <andreas@theosys.at>
* All rights reserved!
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <syslog.h>
#include <errno.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "sensor.h"
#include "usb_comm.h"
#include "heizung.h"
#define CommandOn 0x0003
#define CommandOff 0x0000
typedef struct
{
int pressure;
int temperature;
time_t tstamp;
} mpoint;
float GetTemp ()
{
int fd;
long anz, offset;
double delta_p;
struct stat st;
mpoint mp;
time_t t;
if ((fd = open (configs.Werte, O_RDONLY)) == -1)
{
syslog(LOG_DAEMON, "Error opening file %s: %s", configs.Werte, strerror(errno));
return 9999.0;
}
if (fstat (fd, &st) == -1)
{
syslog(LOG_DAEMON, "Error stating file %s: %s", configs.Werte, strerror(errno));
close (fd);
return 9999.0;
}
if (st.st_size < sizeof (mpoint))
{
syslog(LOG_DAEMON, "No entries in file %s", configs.Werte);
close (fd);
return 9999.0;
}
anz = st.st_size / sizeof (mpoint);
offset = (anz - 1) * sizeof (mpoint);
lseek (fd, offset, 0);
read (fd, &mp, sizeof (mpoint));
close (fd);
t = time (NULL);
/*
* Da unsere Temperaturmessung Teil des Drucksensors ist und der
* Daemon durchaus einmal abstürzen kann, wodurch dann keine
* brauchbare Temperatur mehr existiert, müssen wir hier sicher
* stellen, das sich die Heizung abschaltet und das Programm
* beendet. Das ist der Fall, wenn die letzte Messung mehr als
* 10 Minuten zurück liegt.
*/
if (t > (mp.tstamp + 600L))
{
SwitchOff ();
syslog(LOG_DAEMON, "Warning: No temperature was meassured in the last 10 minutes!");
close (fd);
return 9999.0;
}
// Luftdruck
delta_p = pow((1.0 - (6.5 * 256.0) / 288000.0), 5.255);
ActPressure = (float)(mp.pressure / 10.0) / delta_p;
// Temperatur
return ((float)mp.temperature - 10.0) / 10.0;
}
void SwitchOn ()
{
int set_bits;
if (serialDev.switch_fd < 0)
{
syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (EIN)");
return;
}
set_bits = CommandOn;
if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
syslog(LOG_DAEMON, "Fehler beim Einschalten!");
syslog(LOG_INFO, "Heizung EIN");
}
void SwitchOff ()
{
int set_bits;
if (serialDev.switch_fd < 0)
{
syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (AUS)");
return;
}
set_bits = CommandOff;
if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
syslog(LOG_DAEMON, "Fehler beim Ausschalten!");
syslog(LOG_INFO, "Heizung AUS");
}