Blame view

hvc.c 3.09 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"
11824cae   Pierre Letousey   Added automatic p...
17
  #include "pump.h"
9e9f365e   henyxia   Added HVC interface
18
19
20
  
  #define	DEVICE1				"/dev/ttyACM1"
  #define	SPEED				B19200
ac0ae6b0   henyxia   HVC can now use t...
21
  #define HVC_POLLING_TIME	50000
9e9f365e   henyxia   Added HVC interface
22
23
24
25
  #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...
26
27
28
29
  #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
30
31
32
33
34
35
  
  // Globals
  int		hvc_fd = -1;
  bool	hvcStop = false;
  bool	sPump = false;
  bool	sHeat = false;
bb8c2799   henyxia   Fixed version
36
  bool	autoHeat = false;
9e9f365e   henyxia   Added HVC interface
37
  struct	termios hvcSaveterm;
ac0ae6b0   henyxia   HVC can now use t...
38
39
  bool	wHeat = false;
  bool	wPump = false;
5dd66ab0   henyxia   Added timer optio...
40
41
42
43
44
45
  time_t	tHeatStart;
  time_t	tHeatStop;
  double	tHeatTimer;
  time_t	tPumpStart;
  double	tPumpTimer;
  time_t	tPumpStop;
bb8c2799   henyxia   Fixed version
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  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...
67
68
69
70
71
72
73
74
  
  void stopHVC()
  {
  	hvcStop = true;
  }
  
  void setPumpWantedState(bool s)
  {
5dd66ab0   henyxia   Added timer optio...
75
76
  	tPumpStart = clock();
  	tPumpStop = clock();
ac0ae6b0   henyxia   HVC can now use t...
77
78
79
80
81
  	wPump = s;
  }
  
  void setHeatWantedState(bool s)
  {
5dd66ab0   henyxia   Added timer optio...
82
83
  	tHeatStart = clock();
  	tHeatStop = clock();
ac0ae6b0   henyxia   HVC can now use t...
84
85
  	wHeat = s;
  }
9e9f365e   henyxia   Added HVC interface
86
  
5dd66ab0   henyxia   Added timer optio...
87
88
89
90
91
92
93
94
95
96
  void setPumpTimer(double t)
  {
  	tPumpTimer = t;
  }
  
  void setHeatTimer(double t)
  {
  	tHeatTimer = t;
  }
  
8dca7aeb   henyxia   Automatic Pumping...
97
98
99
100
101
  void setAutoHeat(bool s)
  {
  	autoHeat = s;
  }
  
9e9f365e   henyxia   Added HVC interface
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
128
  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...
129
  	float temp;
9e9f365e   henyxia   Added HVC interface
130
131
132
133
134
135
136
  
  	while(!hvcStop)
  	{
  		printx(DEBUG, HVC, "Querying data\n");
  		sendData(&hvc_fd, GET_TEMP);
  		data = getData(&hvc_fd);
  		setTemp(data);
8dca7aeb   henyxia   Automatic Pumping...
137
  		temp = 25 + (((float)(80*data)))/255;
bf0cbb04   Pierre Letousey   Automatic regulation
138
  		actTemp(temp);
5808c112   henyxia   Temperature now o...
139
  		printx(DEBUG, TEMP, "TEMP %f\n", temp);
5dd66ab0   henyxia   Added timer optio...
140
141
142
143
144
145
146
  		if(tHeatTimer > 0)
  		{
  			tHeatStop = clock();
  			if(((double)(tHeatStop - tHeatStart) / CLOCKS_PER_SEC) > tHeatTimer)
  			{
  				wHeat = false;
  				tHeatTimer = 0;
5dd66ab0   henyxia   Added timer optio...
147
  			}
5dd66ab0   henyxia   Added timer optio...
148
149
150
151
152
153
154
155
156
  		}
  
  		if(tPumpTimer > 0)
  		{
  			tPumpStop = clock();
  			if(((double)(tPumpStop - tPumpStart) / CLOCKS_PER_SEC) > tPumpTimer)
  			{
  				wPump = false;
  				tPumpTimer = 0;
5dd66ab0   henyxia   Added timer optio...
157
158
159
  			}
  		}
  
ac0ae6b0   henyxia   HVC can now use t...
160
161
162
163
164
  		if(wHeat ^ sHeat)
  		{
  			sendData(&hvc_fd, wHeat ? SET_HEAT_ON : SET_HEAT_OFF);
  			sHeat = wHeat;
  			setHeat(sHeat);
5dd66ab0   henyxia   Added timer optio...
165
166
  			if(sHeat)
  				tHeatStart = clock();
ac0ae6b0   henyxia   HVC can now use t...
167
168
169
170
171
172
173
  		}
  
  		if(wPump ^ sPump)
  		{
  			sendData(&hvc_fd, wPump ? SET_PUMP_ON : SET_PUMP_OFF);
  			sPump = wPump;
  			setPump(sPump);
5dd66ab0   henyxia   Added timer optio...
174
175
  			if(sPump)
  				tPumpStart = clock();
ac0ae6b0   henyxia   HVC can now use t...
176
177
  		}
  
9e9f365e   henyxia   Added HVC interface
178
179
180
181
182
  		usleep(HVC_POLLING_TIME);
  	}
  
  	return NULL;
  }