Subversion Repositories heizung

Rev

Rev 5 | Rev 8 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 andreas 1
/*
2
 * (C) Copyright 2011 by Andreas Theofilu <andreas@theosys.at>
3
 * All rights reserved!
4
 */
5
#include <stdio.h>
6
#include <string.h>
7
#include <unistd.h>
8
#include <stdlib.h>
9
#include <math.h>
10
#include <time.h>
11
#include <syslog.h>
12
#include <errno.h>
13
#include <pthread.h>
14
#include <sys/stat.h>
15
#include <sys/types.h>
16
#include <sys/socket.h>
17
#include <fcntl.h>
18
#include <sys/ioctl.h>
19
#include "sensor.h"
20
#include "usb_comm.h"
21
#include "heizung.h"
22
 
23
#define CommandOn       0x0003
24
#define CommandOff      0x0000
25
 
26
typedef struct
27
{
28
        int pressure;
29
        int temperature;
30
        time_t tstamp;
31
} mpoint;
32
 
33
float GetTemp ()
34
{
35
int fd;
36
long anz, offset;
7 andreas 37
double delta_p;
5 andreas 38
struct stat st;
39
mpoint mp;
40
time_t t;
41
 
42
        if ((fd = open (configs.Werte, O_RDONLY)) == -1)
43
        {
44
           syslog(LOG_DAEMON, "Error opening file %s: %s", configs.Werte, strerror(errno));
45
           return 9999.0;
46
        }
47
 
48
        if (fstat (fd, &st) == -1)
49
        {
50
           syslog(LOG_DAEMON, "Error stating file %s: %s", configs.Werte, strerror(errno));
51
           close (fd);
52
           return 9999.0;
53
        }
54
 
55
        if (st.st_size < sizeof (mpoint))
56
        {
57
           syslog(LOG_DAEMON, "No entries in file %s", configs.Werte);
58
           close (fd);
59
           return 9999.0;
60
        }
61
 
62
        anz = st.st_size / sizeof (mpoint);
63
        offset = (anz - 1) * sizeof (mpoint);
64
 
65
        lseek (fd, offset, 0);
66
        read (fd, &mp, sizeof (mpoint));
67
        close (fd);
68
        t = time (NULL);
69
 
70
        /*
71
         * Da unsere Temperaturmessung Teil des Drucksensors ist und der
72
         * Daemon durchaus einmal abstürzen kann, wodurch dann keine
73
         * brauchbare Temperatur mehr existiert, müssen wir hier sicher
74
         * stellen, das sich die Heizung abschaltet und das Programm
75
         * beendet. Das ist der Fall, wenn die letzte Messung mehr als
76
         * 10 Minuten zurück liegt.
77
         */
78
        if (t > (mp.tstamp + 600L))
79
        {
80
           SwitchOff ();
81
           syslog(LOG_DAEMON, "Warning: No temperature was meassured in the last 10 minutes!");
82
           close (fd);
83
           return 9999.0;
84
        }
85
 
86
	// Luftdruck
7 andreas 87
	delta_p = pow((1.0 - (6.5 * 256.0) / 288000.0), 5.255);
88
	ActPressure = (float)(mp.pressure / 10.0) / delta_p;
5 andreas 89
	// Temperatur
90
	return ((float)mp.temperature - 10.0) / 10.0;
91
}
92
 
93
void SwitchOn ()
94
{
95
int set_bits;
96
 
97
        if (serialDev.switch_fd < 0)
98
        {
99
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (EIN)");
100
           return;
101
        }
102
 
103
        set_bits = CommandOn;
104
 
105
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
106
           syslog(LOG_DAEMON, "Fehler beim Einschalten!");
107
 
108
        syslog(LOG_INFO, "Heizung EIN");
109
}
110
 
111
void SwitchOff ()
112
{
113
int set_bits;
114
 
115
        if (serialDev.switch_fd < 0)
116
        {
117
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (AUS)");
118
           return;
119
        }
120
 
121
        set_bits = CommandOff;
122
 
123
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
124
           syslog(LOG_DAEMON, "Fehler beim Ausschalten!");
125
 
126
        syslog(LOG_INFO, "Heizung AUS");
127
}