Blame view

hvc.c 3.07 KB
9e9f365e   henyxia   Added HVC interface
1
2
3
4
5
6
7
8
9
10
  #include <stdio.h>
  #include <stdlib.h>
  #include <termios.h>
  #include <unistd.h>
  #include <errno.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  #include <strings.h>
  #include <inttypes.h>
5dd66ab0   henyxia   Added timer optio...
11
  #include <time.h>
9e9f365e   henyxia   Added HVC interface
12
13
14
15
  #include "ui.h"
  #include "hvc.h"
  #include "printx.h"
  #include "serial.h"
8dca7aeb   henyxia   Automatic Pumping...
16
  #include "heat.h"
9e9f365e   henyxia   Added HVC interface
17
18
19
  
  #define	DEVICE1				"/dev/ttyACM1"
  #define	SPEED				B19200
ac0ae6b0   henyxia   HVC can now use t...
20
  #define HVC_POLLING_TIME	50000
9e9f365e   henyxia   Added HVC interface
21
22
23
24
  #define	WAIT_BEFORE_RETRY	5000
  #define	GET_DEVICE_MODEL	'A'
  #define	DEVICE_MODEL_HVC	'C'
  #define	GET_TEMP			'H'
ac0ae6b0   henyxia   HVC can now use t...
25
26
27
28
  #define	SET_HEAT_ON			'E'
  #define	SET_HEAT_OFF		'G'
  #define	SET_PUMP_ON			'B'
  #define	SET_PUMP_OFF		'D'
9e9f365e   henyxia   Added HVC interface
29
30
31
32
33
34
  
  // Globals
  int		hvc_fd = -1;
  bool	hvcStop = false;
  bool	sPump = false;
  bool	sHeat = false;
bb8c2799   henyxia   Fixed version
35
  bool	autoHeat = false;
9e9f365e   henyxia   Added HVC interface
36
  struct	termios hvcSaveterm;
ac0ae6b0   henyxia   HVC can now use t...
37
38
  bool	wHeat = false;
  bool	wPump = false;
5dd66ab0   henyxia   Added timer optio...
39
40
41
42
43
44
  time_t	tHeatStart;
  time_t	tHeatStop;
  double	tHeatTimer;
  time_t	tPumpStart;
  double	tPumpTimer;
  time_t	tPumpStop;
bb8c2799   henyxia   Fixed version
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  int		tempCons;
  
  void setPumpOn()
  {
  	setPumpWantedState(true);
  }
  
  void setPumpOff()
  {
  	setPumpWantedState(false);
  }
  
  void setHeatOn()
  {
  	setHeatWantedState(true);
  }
  
  void setHeatOff()
  {
  	setHeatWantedState(false);
  }
ac0ae6b0   henyxia   HVC can now use t...
66
67
68
69
70
71
72
73
  
  void stopHVC()
  {
  	hvcStop = true;
  }
  
  void setPumpWantedState(bool s)
  {
5dd66ab0   henyxia   Added timer optio...
74
75
  	tPumpStart = clock();
  	tPumpStop = clock();
ac0ae6b0   henyxia   HVC can now use t...
76
77
78
79
80
  	wPump = s;
  }
  
  void setHeatWantedState(bool s)
  {
5dd66ab0   henyxia   Added timer optio...
81
82
  	tHeatStart = clock();
  	tHeatStop = clock();
ac0ae6b0   henyxia   HVC can now use t...
83
84
  	wHeat = s;
  }
9e9f365e   henyxia   Added HVC interface
85
  
5dd66ab0   henyxia   Added timer optio...
86
87
88
89
90
91
92
93
94
95
  void setPumpTimer(double t)
  {
  	tPumpTimer = t;
  }
  
  void setHeatTimer(double t)
  {
  	tHeatTimer = t;
  }
  
8dca7aeb   henyxia   Automatic Pumping...
96
97
98
99
100
  void setAutoHeat(bool s)
  {
  	autoHeat = s;
  }
  
9e9f365e   henyxia   Added HVC interface
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  bool initHVC()
  {
  	unsigned char data;
  	printx(DEBUG, HVC, "Connecting to interface 1\n");
  	if(init_serial(DEVICE1, SPEED, &hvc_fd, &hvcSaveterm))
  	{
  		printx(DEBUG, HVC, "Connected to an interface\n");
  		sendData(&hvc_fd, GET_DEVICE_MODEL);
  		printx(DEBUG, HVC, "Sended identification request %02x\n", GET_DEVICE_MODEL);
  		data = getData(&hvc_fd);
  		if(data == DEVICE_MODEL_HVC)
  			printx(INFO, HVC, "HVC Arduino connected\n");
  		else
  			printx(DEBUG, HVC, "HVC Arduino not found, response was %02x\n", data);
  	}
  	else
  	{
  		printx(WARNING, HVC, "Unable to connect to such interface\n");
  		return false;
  	}
  
  	return true;
  }
  
  void* processHVC(void* we)
  {
  	uint8_t data;
8dca7aeb   henyxia   Automatic Pumping...
128
  	float temp;
9e9f365e   henyxia   Added HVC interface
129
130
131
132
133
134
135
  
  	while(!hvcStop)
  	{
  		printx(DEBUG, HVC, "Querying data\n");
  		sendData(&hvc_fd, GET_TEMP);
  		data = getData(&hvc_fd);
  		setTemp(data);
8dca7aeb   henyxia   Automatic Pumping...
136
  		temp = 25 + (((float)(80*data)))/255;
bf0cbb04   Pierre Letousey   Automatic regulation
137
  		actTemp(temp);
8dca7aeb   henyxia   Automatic Pumping...
138
  		printx(DEBUG, HVC, "TEMP %f\n", temp);
5dd66ab0   henyxia   Added timer optio...
139
140
141
142
143
144
145
  		if(tHeatTimer > 0)
  		{
  			tHeatStop = clock();
  			if(((double)(tHeatStop - tHeatStart) / CLOCKS_PER_SEC) > tHeatTimer)
  			{
  				wHeat = false;
  				tHeatTimer = 0;
5dd66ab0   henyxia   Added timer optio...
146
  			}
5dd66ab0   henyxia   Added timer optio...
147
148
149
150
151
152
153
154
155
  		}
  
  		if(tPumpTimer > 0)
  		{
  			tPumpStop = clock();
  			if(((double)(tPumpStop - tPumpStart) / CLOCKS_PER_SEC) > tPumpTimer)
  			{
  				wPump = false;
  				tPumpTimer = 0;
5dd66ab0   henyxia   Added timer optio...
156
157
158
  			}
  		}
  
ac0ae6b0   henyxia   HVC can now use t...
159
160
161
162
163
  		if(wHeat ^ sHeat)
  		{
  			sendData(&hvc_fd, wHeat ? SET_HEAT_ON : SET_HEAT_OFF);
  			sHeat = wHeat;
  			setHeat(sHeat);
5dd66ab0   henyxia   Added timer optio...
164
165
  			if(sHeat)
  				tHeatStart = clock();
ac0ae6b0   henyxia   HVC can now use t...
166
167
168
169
170
171
172
  		}
  
  		if(wPump ^ sPump)
  		{
  			sendData(&hvc_fd, wPump ? SET_PUMP_ON : SET_PUMP_OFF);
  			sPump = wPump;
  			setPump(sPump);
5dd66ab0   henyxia   Added timer optio...
173
174
  			if(sPump)
  				tPumpStart = clock();
ac0ae6b0   henyxia   HVC can now use t...
175
176
  		}
  
9e9f365e   henyxia   Added HVC interface
177
178
179
180
181
  		usleep(HVC_POLLING_TIME);
  	}
  
  	return NULL;
  }