Subversion Repositories heizung

Rev

Rev 7 | 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;
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
        ActPressure = (float)(mp.temperature - 10) / 10.0;
        // 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");
}