/
sensors.h
166 lines (144 loc) · 3.24 KB
/
sensors.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#ifndef SENSORS_H
#define SENSORS_H
#include <time.h>
#include <velib/base/base.h>
#include <velib/types/ve_item.h>
typedef enum {
SENSOR_FUNCTION_NONE,
SENSOR_FUNCTION_DEFAULT,
SENSOR_FUNCTION_COUNT
} SensorFunction;
typedef enum {
SENSOR_STATUS_OK,
SENSOR_STATUS_NOT_CONNECTED,
SENSOR_STATUS_SHORT,
SENSOR_STATUS_REVERSE_POLARITY,
SENSOR_STATUS_UNKNOWN,
SENSOR_STATUS_RANGE,
} SensorStatus;
typedef enum {
TANK_STANDARD_INVALID = -1,
TANK_STANDARD_EU,
TANK_STANDARD_US,
TANK_STANDARD_CUSTOM,
TANK_STANDARD_COUNT
} TankStandard;
typedef enum {
TANK_SENSE_INVALID = -1,
TANK_SENSE_RESISTANCE,
TANK_SENSE_VOLTAGE,
TANK_SENSE_CURRENT,
TANK_SENSE_COUNT,
} TankSenseType;
typedef enum {
SENSOR_TYPE_TANK,
SENSOR_TYPE_TEMP,
} SensorType;
typedef struct {
char service[64];
veBool connected;
} SensorDbusInterface;
// sensor signal correction parameters
typedef struct {
float scale;
float offset;
} SignalCorrection;
#define FILTER_LEN 64
#define FILTER_MASK (FILTER_LEN - 1)
typedef struct {
float values[FILTER_LEN];
float sum;
unsigned len;
unsigned head;
unsigned tail;
} Filter;
// building a sensor signal conditioning structure
typedef struct {
SignalCorrection sigCorrect;
Filter filter;
} SignalCondition;
// building a sensor interface structure
typedef struct {
int devfd;
int adcPin;
int gpio;
float adcScale;
float adcSample;
SignalCondition sigCond;
SensorDbusInterface dbus;
} SensorInterface;
// building a sensor structure
typedef struct AnalogSensor {
SensorType sensorType;
int instance;
veBool valid;
SensorInterface interface;
struct VeDbus *dbus;
struct VeItem *root;
struct VeItem *function;
char ifaceName[64];
char serial[32];
struct VeItem *statusItem;
struct VeItem *rawValueItem;
struct VeItem *rawUnitItem;
struct VeItem *filterLenItem;
struct AnalogSensor *next;
} AnalogSensor;
#define TANK_SHAPE_MAX_POINTS 10
struct TankAlarm {
struct VeItem *alarmItem;
struct VeItem *enableItem;
struct VeItem *activeLevelItem;
struct VeItem *restoreLevelItem;
struct VeItem *onDelayItem;
time_t tripTime;
};
struct TankSensor {
AnalogSensor sensor;
TankSenseType senseType;
TankStandard standard;
float minVal;
float maxVal;
float emptyVal;
float fullVal;
int shapeMapLen;
float shapeMap[TANK_SHAPE_MAX_POINTS + 2][2];
struct VeItem *levelItem;
struct VeItem *remaingItem;
struct VeItem *capacityItem;
struct VeItem *fluidTypeItem;
struct VeItem *standardItem; /* tanksensor standard, EU vs US e.g. */
struct VeItem *emptyRItem;
struct VeItem *fullRItem;
struct VeItem *shapeItem;
struct VeItem *senseTypeItem;
struct TankAlarm alarmLow;
struct TankAlarm alarmHigh;
};
struct TemperatureSensor {
AnalogSensor sensor;
struct VeItem *temperatureItem;
struct VeItem *scaleItem;
struct VeItem *offsetItem;
};
typedef struct {
int devfd;
int pin;
int gpio;
float scale;
SensorType type;
char dev[32];
char label[32];
char serial[32];
int product_id;
int func_def;
} SensorInfo;
AnalogSensor *sensorCreate(SensorInfo *s);
void sensorTick(void);
veBool adcRead(un32 *value, AnalogSensor *sensor);
float adcFilter(float x, Filter *f);
void adcFilterReset(Filter *f);
void adcFilterSetLen(Filter *f, unsigned len);
struct VeItem *getLocalSettings(void);
struct VeItem *getDbusRoot(void);
#endif