2
* sec.h -- header for sec protocol module
4
* Copyright (C) 2000 John Marley
5
* The author can be contacted at: John.Marley@alcatel.com.au
8
* Created On : Thu Mar 29 11:07:01 2001
9
* Last Modified By: John Marley
10
* Last Modified On: Fri May 4 16:26:00 2001
12
* Status : Unknown, Use with caution!
15
* Revision 1.2 2001/05/08 03:21:09 marleyj
16
* Added supported() macro.
18
* Revision 1.1 2001/05/02 04:54:33 marleyj
23
#define SEC_MSG_STARTCHAR '^'
24
#define SEC_POLLCMD 'P'
25
#define SEC_SETCMD 'S'
26
#define SEC_DATAMSG 'D'
27
#define SEC_UPSMSG '*'
32
#define SEC_AVAILP1 "AP1" /* Part1 of available variables */
33
#define SEC_AVAILP2 "AP2" /* Part1 of available variables */
34
#define SEC_AUTORESTART "ATR" /* Enable/disable auto restart */
35
#define SEC_MFR "MAN" /* UPS Manufacturer */
36
#define SEC_MOD "MOD" /* UPS Model */
37
#define SEC_NOMINAL "NOM" /* Nominal Values */
38
#define SEC_SHUTDOWN "PSD" /* Shutdown after delay/cancel */
39
#define SEC_REBOOT "RWD" /* Reboot with duration/cancel */
40
#define SEC_SHUTTYPE "SDA" /* Shutdown Type */
41
#define SEC_BATTSTAT "ST1" /* Battery Status */
42
#define SEC_INPUTSTAT "ST2" /* Input Status */
43
#define SEC_OUTPUTSTAT "ST3" /* Output Status */
44
#define SEC_BYPASSSTAT "ST4" /* Bypass Status */
45
#define SEC_ALARMSTAT "ST5" /* UPS Alarms */
46
#define SEC_STARTDELAY "STD" /* Startup after delay */
47
#define SEC_TESTRESULT "STR" /* Test Results */
48
#define SEC_TEST "TST" /* UPS Test/abort */
49
#define SEC_BAUDRATE "UBR" /* UPS Baud Rate */
50
#define SEC_UPSID "UID" /* UPS Identifier */
51
#define SEC_VERSION "VER" /* UPS Software Version */
53
/* Some baud rates for setup_serial() */
66
* Exhaustive information for each possible variable
68
#define SEC_NUMVARS 89
69
#define SEC_MAX_VARSIZE 65
71
/* macro for checking whether a variable is supported */
72
#define supported(v) (getdata(v) != NULL)
74
struct sec_varlist_t {
75
int infotag; /* INFO_x define from shared.h */
76
char *name; /* Human readable text (also in shared-tables.h) */
77
int unit; /* Variable should be divided by this */
78
char *cmd; /* Command to send to pool/set variable */
79
int field; /* Which returned field variable corresponsd to */
80
int size; /* string length/integer max/enum count */
81
int edi; /* 'E'numerated 'D'ata 'I'ndex */
82
int flags; /* Flags for addinfo() */
83
char value[SEC_MAX_VARSIZE];
85
{ INFO_UNUSED, "", 0, "", 0, 0, 0, 0 },
86
/*infotag name unit cmd field size edi flags */
87
{ INFO_ALRM_PWRWAIT, "Alarm Awaiting Power", 1, SEC_ALARMSTAT, 13, 2, 0, FLAG_ENUM },
88
{ INFO_ALRM_BADBYPASS, "Alarm Bypass Bad", 1, SEC_ALARMSTAT, 5, 2, 2, FLAG_ENUM },
89
{ INFO_ALRM_CHARGFAIL, "Alarm Charger Failure", 1, SEC_ALARMSTAT, 8, 2, 4, FLAG_ENUM },
90
{ INFO_ALRM_FANFAIL, "Alarm Fan Failure", 1, SEC_ALARMSTAT, 10, 2, 6, FLAG_ENUM },
91
{ INFO_ALRM_FUSEFAIL, "Alarm Fuse Failure", 1, SEC_ALARMSTAT, 11, 2, 8, FLAG_ENUM },
92
{ INFO_ALRM_GENERAL, "Alarm General Fault", 1, SEC_ALARMSTAT, 12, 2, 10, FLAG_ENUM },
93
{ INFO_ALRM_BADINPUT, "Alarm Input Bad", 1, SEC_ALARMSTAT, 2, 2, 12, FLAG_ENUM },
94
{ INFO_ALRM_BADOUTPUT, "Alarm Output Bad", 1, SEC_ALARMSTAT, 3, 2, 14, FLAG_ENUM },
95
{ INFO_ALRM_OUTPUTOFF, "Alarm Output Off", 1, SEC_ALARMSTAT, 6, 2, 16, FLAG_ENUM },
96
{ INFO_ALRM_OVERLOAD, "Alarm Overload", 1, SEC_ALARMSTAT, 4, 2, 18, FLAG_ENUM },
97
{ INFO_ALRM_IMMSHUT, "Alarm Shutdown Imminent", 1, SEC_ALARMSTAT, 15, 2, 20, FLAG_ENUM },
98
{ INFO_ALRM_PENDSHUT, "Alarm Shutdown Pending", 1, SEC_ALARMSTAT, 14, 2, 22, FLAG_ENUM },
99
{ INFO_ALRM_SYSOFF, "Alarm System Off", 1, SEC_ALARMSTAT, 9, 2, 24, FLAG_ENUM },
100
{ INFO_ALRM_TEMP, "Alarm Temperature", 1, SEC_ALARMSTAT, 1, 2, 26, FLAG_ENUM },
101
{ INFO_ALRM_UPSSHUT, "Alarm UPS Shutdown", 1, SEC_ALARMSTAT, 7, 2, 28, FLAG_ENUM },
102
{ INFO_AUDIBLEALRM, "Audible Alarm", 1, SEC_NOMINAL, 8, 4, 29, FLAG_ENUM | FLAG_RW },
103
{ INFO_AUTORESTART, "Auto Restart", 1, SEC_AUTORESTART, 1, 2, 33, FLAG_ENUM | FLAG_RW },
104
{ INFO_BATT_CHARGE, "Battery Charge", 1, SEC_BATTSTAT, 3, 4, 36, FLAG_ENUM },
105
{ INFO_BATT_COND, "Battery Condition", 1, SEC_BATTSTAT, 1, 3, 40, FLAG_ENUM },
106
{ INFO_BATT_CURRENT, "Battery Current", 10, SEC_BATTSTAT, 8, 9999, 0, 0 },
107
{ INFO_BATT_DATE, "Battery Installed", 1, SEC_NOMINAL, 11, 8, 0, FLAG_STRING | FLAG_RW },
108
{ INFO_BATT_STATUS, "Battery Status", 1, SEC_BATTSTAT, 2, 3, 43, FLAG_ENUM },
109
{ INFO_BATT_TEMP, "Battery Temperature", 1, SEC_BATTSTAT, 9, 99, 0, 0 },
110
{ INFO_BATT_VOLT, "Battery Voltage", 10, SEC_BATTSTAT, 7, 9999, 0, 0 },
111
{ INFO_BYPASS_CURRENT1, "Bypass Current 1", 10, SEC_BYPASSSTAT, 4, 9999, 0, 0 },
112
{ INFO_BYPASS_CURRENT2, "Bypass Current 2", 10, SEC_BYPASSSTAT, 7, 9999, 0, 0 },
113
{ INFO_BYPASS_CURRENT3, "Bypass Current 3", 10, SEC_BYPASSSTAT, 10, 9999, 0, 0 },
114
{ INFO_BYPASS_FREQ, "Bypass Frequency", 10, SEC_BYPASSSTAT, 1, 999, 0, 0 },
115
{ INFO_BYPASS_NLINES, "Bypass Num Lines", 1, SEC_BYPASSSTAT, 2, 9, 0, 0 },
116
{ INFO_BYPASS_PWR1, "Bypass Power 1", 1, SEC_BYPASSSTAT, 5, 99999, 0, 0 },
117
{ INFO_BYPASS_PWR2, "Bypass Power 2", 1, SEC_BYPASSSTAT, 8, 99999, 0, 0 },
118
{ INFO_BYPASS_PWR3, "Bypass Power 3", 1, SEC_BYPASSSTAT, 11, 99999, 0, 0 },
119
{ INFO_BYPASS_VOLT1, "Bypass Voltage 1", 10, SEC_BYPASSSTAT, 3, 9999, 0, 0 },
120
{ INFO_BYPASS_VOLT2, "Bypass Voltage 2", 10, SEC_BYPASSSTAT, 6, 9999, 0, 0 },
121
{ INFO_BYPASS_VOLT3, "Bypass Voltage 3", 10, SEC_BYPASSSTAT, 9, 9999, 0, 0 },
122
{ INFO_BATT_PCT, "Estimated Charge", 1, SEC_BATTSTAT, 6, 999, 0, 0 },
123
{ INFO_RUNTIME, "Estimated Minutes", 1, SEC_BATTSTAT, 5, 999, 0, 0 },
124
{ INFO_HIGHXFER, "High Volt Xfer Pt", 1, SEC_NOMINAL, 10, 999, 0, FLAG_STRING | FLAG_RW },
125
{ INFO_UPSIDENT, "Identification", 1, SEC_UPSID, 1, 64, 0, FLAG_STRING | FLAG_RW },
126
{ INFO_IN_CURRENT1, "Input Current 1", 10, SEC_INPUTSTAT, 5, 9999, 0, 0 },
127
{ INFO_IN_CURRENT2, "Input Current 2", 10, SEC_INPUTSTAT, 9, 9999, 0, 0 },
128
{ INFO_IN_CURRENT3, "Input Current 3", 10, SEC_INPUTSTAT, 13, 9999, 0, 0 },
129
{ INFO_IN_ACFREQ1, "Input Frequency 1", 10, SEC_INPUTSTAT, 3, 999, 0, 0 },
130
{ INFO_IN_ACFREQ2, "Input Frequency 2", 10, SEC_INPUTSTAT, 7, 999, 0, 0 },
131
{ INFO_IN_ACFREQ3, "Input Frequency 3", 10, SEC_INPUTSTAT, 11, 999, 0, 0 },
132
{ INFO_IN_LINEBADS, "Input Line Bads", 1, SEC_INPUTSTAT, 1, 999, 0, 0 },
133
{ INFO_IN_NLINES, "Input Num Lines", 1, SEC_INPUTSTAT, 2, 9, 0, 0 },
134
{ INFO_IN_PWR1, "Input Power 1", 1, SEC_INPUTSTAT, 6, 99999, 0, 0 },
135
{ INFO_IN_PWR2, "Input Power 2", 1, SEC_INPUTSTAT, 10, 99999, 0, 0 },
136
{ INFO_IN_PWR3, "Input Power 3", 1, SEC_INPUTSTAT, 14, 99999, 0, 0 },
137
{ INFO_IN_VOLT1, "Input Voltage 1", 10, SEC_INPUTSTAT, 4, 9999, 0, 0 },
138
{ INFO_IN_VOLT2, "Input Voltage 2", 10, SEC_INPUTSTAT, 8, 9999, 0, 0 },
139
{ INFO_IN_VOLT3, "Input Voltage 3", 10, SEC_INPUTSTAT, 12, 9999, 0, 0 },
140
{ INFO_LOWXFER, "Low Volt Xfer Pt", 1, SEC_NOMINAL, 9, 999, 0, FLAG_STRING | FLAG_RW },
141
{ INFO_MFR, "Manufacturer", 1, SEC_MFR, 1, 32, 0, FLAG_STRING },
142
{ INFO_MODEL, "Model", 1, SEC_MOD, 1, 64, 0, FLAG_STRING },
143
{ INFO_NOM_BATTLIFE, "Nominal Battery Life", 1, SEC_NOMINAL, 12, 99999, 0, FLAG_STRING | FLAG_RW },
144
{ INFO_NOM_IN_FREQ, "Nominal Input Frequency", 10, SEC_NOMINAL, 2, 999, 0, FLAG_RW },
145
{ INFO_NOM_IN_VOLT, "Nominal Input Voltage", 1, SEC_NOMINAL, 1, 999, 0, FLAG_STRING | FLAG_RW },
146
{ INFO_NOM_LOBATTIME, "Nominal Low Battery Time", 1, SEC_NOMINAL, 7, 99, 0, FLAG_STRING | FLAG_RW },
147
{ INFO_NOM_OUT_FREQ, "Nominal Output Frequency", 10, SEC_NOMINAL, 4, 999, 0, FLAG_RW },
148
{ INFO_NOM_OUT_PWR, "Nominal Output Power", 1, SEC_NOMINAL, 6, 99999, 0, FLAG_STRING | FLAG_RW },
149
{ INFO_NOM_OUT_VOLT, "Nominal Output Voltage", 1, SEC_NOMINAL, 3, 999, 0, FLAG_STRING | FLAG_RW },
150
{ INFO_NOM_VA_RATE, "Nominal VA Rating", 1, SEC_NOMINAL, 5, 99999, 0, FLAG_STRING | FLAG_RW },
151
{ INFO_OUT_CURRENT1, "Output Current 1", 10, SEC_OUTPUTSTAT, 5, 9999, 0, 0 },
152
{ INFO_OUT_CURRENT2, "Output Current 2", 10, SEC_OUTPUTSTAT, 9, 9999, 0, 0 },
153
{ INFO_OUT_CURRENT3, "Output Current 3", 10, SEC_OUTPUTSTAT, 13, 9999, 0, 0 },
154
{ INFO_OUT_FREQ, "Output Frequency", 10, SEC_OUTPUTSTAT, 2, 999, 0, 0 },
155
{ INFO_OUT_LOADPCT1, "Output Load 1", 1, SEC_OUTPUTSTAT, 7, 999, 0, 0 },
156
{ INFO_OUT_LOADPCT2, "Output Load 2", 1, SEC_OUTPUTSTAT, 11, 999, 0, 0 },
157
{ INFO_OUT_LOADPCT3, "Output Load 3", 1, SEC_OUTPUTSTAT, 15, 999, 0, 0 },
158
{ INFO_OUT_NLINES, "Output Num Lines", 1, SEC_OUTPUTSTAT, 3, 9, 0, 0 },
159
{ INFO_OUT_LOADPWR1, "Output Power 1", 1, SEC_OUTPUTSTAT, 6, 99999, 0, 0 },
160
{ INFO_OUT_LOADPWR2, "Output Power 2", 1, SEC_OUTPUTSTAT, 10, 99999, 0, 0 },
161
{ INFO_OUT_LOADPWR3, "Output Power 3", 1, SEC_OUTPUTSTAT, 14, 99999, 0, 0 },
162
{ INFO_OUT_SOURCE, "Output Source", 1, SEC_OUTPUTSTAT, 1, 6, 46, FLAG_ENUM },
163
{ INFO_OUT_VOLT1, "Output Voltage 1", 10, SEC_OUTPUTSTAT, 4, 9999, 0, 0 },
164
{ INFO_OUT_VOLT2, "Output Voltage 2", 10, SEC_OUTPUTSTAT, 8, 9999, 0, 0 },
165
{ INFO_OUT_VOLT3, "Output Voltage 3", 10, SEC_OUTPUTSTAT, 12, 9999, 0, 0 },
166
{ INFO_RBTWDUR, "Reboot With Duration", 1, SEC_REBOOT, 1, 9999999, 0, FLAG_WONLY },
167
{ INFO_SECSONBATT, "Seconds on Battery", 1, SEC_BATTSTAT, 4, 99999, 0, 0 },
168
{ INFO_SHUTTYPE, "Shutdown Type", 1, SEC_SHUTTYPE, 1, 2, 51, FLAG_ENUM | FLAG_RW },
169
{ INFO_DELAYSHUT, "Shutdown After Delay", 1, SEC_STARTDELAY, 1, 9999999, 0, FLAG_WONLY },
170
{ INFO_FIRMREV, "Software Version", 1, SEC_VERSION, 1, 32, 0, FLAG_STRING },
171
{ INFO_WAKEDELAY, "Startup After Delay", 1, SEC_STARTDELAY, 1, 9999999, 0, FLAG_WONLY },
172
{ INFO_SLFTSTDETAIL, "Test Results Detail", 1, SEC_TESTRESULT, 2, 64, 0, FLAG_STRING },
173
{ INFO_SLFTSTSUM, "Test Results Summary", 1, SEC_TESTRESULT, 1, 6, 54, FLAG_ENUM },
174
{ INFO_SLFTSTTYPE, "Test Type", 1, SEC_TEST, 1, 5, 61, FLAG_ENUM | FLAG_WONLY },
175
{ INFO_BAUDRATE, "Baud Rate", 1, SEC_BAUDRATE, 1, 19200, 0, FLAG_RW },
180
* List of possible enumerations
183
struct sec_enumdata_t {
184
int type; /* INFO_x type */
185
int index; /* ups value */
186
const char *value; /* enumerated value */
188
{ INFO_ALRM_PWRWAIT, 0, "Not Awaiting Power" },
189
{ INFO_ALRM_PWRWAIT, 1, "Awaiting Power" },
190
{ INFO_ALRM_BADBYPASS, 0, "Bypass OK" },
191
{ INFO_ALRM_BADBYPASS, 1, "Bypass Fault" },
192
{ INFO_ALRM_CHARGFAIL, 0, "Charger OK" },
193
{ INFO_ALRM_CHARGFAIL, 1, "Charger Fault" },
194
{ INFO_ALRM_FANFAIL, 0, "Fan OK" },
195
{ INFO_ALRM_FANFAIL, 1, "Fan Fault" },
196
{ INFO_ALRM_FUSEFAIL, 0, "Fuse OK" },
197
{ INFO_ALRM_FUSEFAIL, 1, "Fuse Fault" },
198
{ INFO_ALRM_GENERAL, 0, "General system OK" },
199
{ INFO_ALRM_GENERAL, 1, "General system Fault" },
200
{ INFO_ALRM_BADINPUT, 0, "Input OK" },
201
{ INFO_ALRM_BADINPUT, 1, "Input Fault" },
202
{ INFO_ALRM_BADOUTPUT, 0, "Output OK" },
203
{ INFO_ALRM_BADOUTPUT, 1, "Output Fault" },
204
{ INFO_ALRM_OUTPUTOFF, 0, "Output On" },
205
{ INFO_ALRM_OUTPUTOFF, 1, "Output off" },
206
{ INFO_ALRM_OVERLOAD, 0, "UPS not overloaded" },
207
{ INFO_ALRM_OVERLOAD, 1, "UPS Overloaded" },
208
{ INFO_ALRM_IMMSHUT, 0, "No Shutdown Imminent" },
209
{ INFO_ALRM_IMMSHUT, 1, "Shutdown Imminent" },
210
{ INFO_ALRM_PENDSHUT, 0, "No Shutdown Pending" },
211
{ INFO_ALRM_PENDSHUT, 1, "Shutdown Pending" },
212
{ INFO_ALRM_SYSOFF, 0, "System On" },
213
{ INFO_ALRM_SYSOFF, 1, "System off" },
214
{ INFO_ALRM_TEMP, 0, "Temperature OK" },
215
{ INFO_ALRM_TEMP, 1, "Over Temperature" },
216
{ INFO_ALRM_UPSSHUT, 0, "UPS not Shutdown" },
217
{ INFO_ALRM_UPSSHUT, 1, "UPS Shutdown" },
218
{ INFO_AUDIBLEALRM, 1, "Disabled" },
219
{ INFO_AUDIBLEALRM, 2, "Enabled" },
220
{ INFO_AUDIBLEALRM, 3, "Muted" },
221
{ INFO_AUDIBLEALRM, 4, "Disabled Until Low Battery warning" },
222
{ INFO_AUTORESTART, 1, "Automatic Restart" },
223
{ INFO_AUTORESTART, 2, "Manual Restart" },
224
{ INFO_BATT_CHARGE, 0, "Floating" },
225
{ INFO_BATT_CHARGE, 1, "Charging" },
226
{ INFO_BATT_CHARGE, 2, "Resting" },
227
{ INFO_BATT_CHARGE, 3, "Discharging" },
228
{ INFO_BATT_COND, 0, "Good" },
229
{ INFO_BATT_COND, 1, "Weak" },
230
{ INFO_BATT_COND, 2, "Replace" },
231
{ INFO_BATT_STATUS, 0, "Battery OK" },
232
{ INFO_BATT_STATUS, 1, "Battery Low" },
233
{ INFO_BATT_STATUS, 2, "Battery Depleted" },
234
{ INFO_OUT_SOURCE, 0, "Normal" },
235
{ INFO_OUT_SOURCE, 1, "On Battery" },
236
{ INFO_OUT_SOURCE, 2, "On Bypass" },
237
{ INFO_OUT_SOURCE, 3, "Reducing" },
238
{ INFO_OUT_SOURCE, 4, "Boosting" },
239
{ INFO_OUT_SOURCE, 5, "Other" },
240
{ INFO_SHUTTYPE, 1, "UPS output only" },
241
{ INFO_SHUTTYPE, 2, "Entire UPS" },
242
{ INFO_SLFTSTSUM, 0, "No test performed" },
243
{ INFO_SLFTSTSUM, 1, "Test Passed" },
244
{ INFO_SLFTSTSUM, 2, "Test in progress" },
245
{ INFO_SLFTSTSUM, 3, "General Test failed" },
246
{ INFO_SLFTSTSUM, 4, "Battery Test failed" },
247
{ INFO_SLFTSTSUM, 5, "Deep Battery Test failed" },
248
{ INFO_SLFTSTTYPE, -1, "Abort test in progress" },
249
{ INFO_SLFTSTTYPE, 0, "No test" },
250
{ INFO_SLFTSTTYPE, 1, "General Systems Test" },
251
{ INFO_SLFTSTTYPE, 2, "Quick Battery Test" },
252
{ INFO_SLFTSTTYPE, 3, "Deep Battery Calibration" },
256
/* a type for the supported variables */
257
#define SEC_QUERYLIST_LEN 17
258
#define SEC_MAXFIELDS 16
260
struct sec_querylist_t {
261
char *command; /* sec command */
262
int varnum[SEC_MAXFIELDS]; /* sec variable number for each field */
263
} sec_querylist[SEC_QUERYLIST_LEN];
265
#define sqv(a,b) sec_querylist[a].varnum[b]