Subversion Repositories heizung

Rev

Rev 7 | Go to most recent revision | Details | 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;
37
struct stat st;
38
mpoint mp;
39
time_t t;
40
 
41
        if ((fd = open (configs.Werte, O_RDONLY)) == -1)
42
        {
43
           syslog(LOG_DAEMON, "Error opening file %s: %s", configs.Werte, strerror(errno));
44
           return 9999.0;
45
        }
46
 
47
        if (fstat (fd, &st) == -1)
48
        {
49
           syslog(LOG_DAEMON, "Error stating file %s: %s", configs.Werte, strerror(errno));
50
           close (fd);
51
           return 9999.0;
52
        }
53
 
54
        if (st.st_size < sizeof (mpoint))
55
        {
56
           syslog(LOG_DAEMON, "No entries in file %s", configs.Werte);
57
           close (fd);
58
           return 9999.0;
59
        }
60
 
61
        anz = st.st_size / sizeof (mpoint);
62
        offset = (anz - 1) * sizeof (mpoint);
63
 
64
        lseek (fd, offset, 0);
65
        read (fd, &mp, sizeof (mpoint));
66
        close (fd);
67
        t = time (NULL);
68
 
69
        /*
70
         * Da unsere Temperaturmessung Teil des Drucksensors ist und der
71
         * Daemon durchaus einmal abstürzen kann, wodurch dann keine
72
         * brauchbare Temperatur mehr existiert, müssen wir hier sicher
73
         * stellen, das sich die Heizung abschaltet und das Programm
74
         * beendet. Das ist der Fall, wenn die letzte Messung mehr als
75
         * 10 Minuten zurück liegt.
76
         */
77
        if (t > (mp.tstamp + 600L))
78
        {
79
           SwitchOff ();
80
           syslog(LOG_DAEMON, "Warning: No temperature was meassured in the last 10 minutes!");
81
           close (fd);
82
           return 9999.0;
83
        }
84
 
85
	// Luftdruck
86
	ActPressure = (float)(mp.temperature - 10) / 10.0;
87
	// Temperatur
88
	return ((float)mp.temperature - 10.0) / 10.0;
89
}
90
 
91
void SwitchOn ()
92
{
93
int set_bits;
94
 
95
        if (serialDev.switch_fd < 0)
96
        {
97
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (EIN)");
98
           return;
99
        }
100
 
101
        set_bits = CommandOn;
102
 
103
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
104
           syslog(LOG_DAEMON, "Fehler beim Einschalten!");
105
 
106
        syslog(LOG_INFO, "Heizung EIN");
107
}
108
 
109
void SwitchOff ()
110
{
111
int set_bits;
112
 
113
        if (serialDev.switch_fd < 0)
114
        {
115
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (AUS)");
116
           return;
117
        }
118
 
119
        set_bits = CommandOff;
120
 
121
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
122
           syslog(LOG_DAEMON, "Fehler beim Ausschalten!");
123
 
124
        syslog(LOG_INFO, "Heizung AUS");
125
}