~iheino+ub/+junk/nut-upsconf-docfix

« back to all changes in this revision

Viewing changes to drivers/apcsmart-old.h

  • Committer: Tuomas Heino
  • Author(s): Laurent Bigonville
  • Date: 2014-04-22 20:46:12 UTC
  • Revision ID: iheino+ub@cc.hut.fi-20140422204612-1x2gh3nkezfsdao4
Tags: upstream-2.7.2
ImportĀ upstreamĀ versionĀ 2.7.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* apcsmart.h - command table for APC smart protocol units
 
2
 
 
3
   Copyright (C) 1999  Russell Kroll <rkroll@exploits.org>
 
4
             (C) 2000  Nigel Metheringham <Nigel.Metheringham@Intechnology.co.uk>
 
5
 
 
6
   This program is free software; you can redistribute it and/or modify
 
7
   it under the terms of the GNU General Public License as published by
 
8
   the Free Software Foundation; either version 2 of the License, or
 
9
   (at your option) any later version.
 
10
 
 
11
   This program is distributed in the hope that it will be useful,
 
12
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
   GNU General Public License for more details.
 
15
 
 
16
   You should have received a copy of the GNU General Public License
 
17
   along with this program; if not, write to the Free Software
 
18
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
19
*/
 
20
 
 
21
#include <ctype.h>
 
22
#include <sys/ioctl.h>
 
23
#include "serial.h"
 
24
#include "timehead.h"
 
25
 
 
26
#define APC_TABLE_VERSION       "version 2.2"
 
27
 
 
28
/* Basic UPS reply line structure */
 
29
#define ENDCHAR 10              /* APC ends responses with LF */
 
30
 
 
31
/* characters ignored by default */
 
32
#define IGNCHARS "\015+$|!~%?=#&"       /* special characters to ignore */
 
33
 
 
34
/* these one is used only during startup, due to ^Z sending certain characters such as # */
 
35
#define MINIGNCHARS "\015+$|!"  /* minimum set of special characters to ignore */
 
36
 
 
37
/* normal polls: characters we don't want to parse (including a few alerts) */
 
38
#define POLL_IGNORE "\015&|"
 
39
 
 
40
/* alert characters we care about - OL, OB, LB, not LB, RB, OVER, not OVER */
 
41
#define POLL_ALERT "$!%+#?="
 
42
 
 
43
#define UPSDELAY          50000 /* slow down multicharacter commands        */
 
44
#define CMDLONGDELAY    1500000 /* some commands need a 1.5s gap for safety */
 
45
 
 
46
#define SER_WAIT_SEC    3       /* wait up to 3.0 sec for ser_get calls */
 
47
#define SER_WAIT_USEC   0
 
48
 
 
49
/* dangerous instant commands must be reconfirmed within a 12 second window */
 
50
#define MINCMDTIME      3
 
51
#define MAXCMDTIME      15
 
52
 
 
53
/* it only does two strings, and they're both the same length */
 
54
#define APC_STRLEN      8
 
55
 
 
56
/* --------------- */
 
57
 
 
58
/* status bits */
 
59
 
 
60
#define APC_STAT_CAL    1       /* calibration */
 
61
#define APC_STAT_TRIM   2       /* SmartTrim */
 
62
#define APC_STAT_BOOST  4       /* SmartBoost */
 
63
#define APC_STAT_OL     8       /* on line */
 
64
#define APC_STAT_OB     16      /* on battery */
 
65
#define APC_STAT_OVER   32      /* overload */
 
66
#define APC_STAT_LB     64      /* low battery */
 
67
#define APC_STAT_RB     128     /* replace battery */
 
68
 
 
69
/* serial protocol: special commands - initialization and such */
 
70
#define APC_STATUS      'Q'
 
71
#define APC_GOSMART     'Y'
 
72
#define APC_GODUMB      'R'
 
73
#define APC_CMDSET      'a'
 
74
#define APC_CAPABILITY  26      /* ^Z */
 
75
#define APC_NEXTVAL     '-'
 
76
 
 
77
/* --------------- */
 
78
 
 
79
/* Driver command table flag values */
 
80
 
 
81
#define APC_POLL        0x0001  /* Poll this variable regularly         */
 
82
#define APC_PRESENT     0x0004  /* Capability seen on this UPS          */
 
83
 
 
84
#define APC_RW          0x0010  /* read-write variable                  */
 
85
#define APC_ENUM        0x0020  /* enumerated type                      */
 
86
#define APC_STRING      0x0040  /* string                               */
 
87
 
 
88
#define APC_NASTY       0x0100  /* Nasty command - take care            */
 
89
#define APC_REPEAT      0x0200  /* Command needs sending twice          */
 
90
 
 
91
#define APC_FORMATMASK  0xFF0000 /* Mask for apc data formats */
 
92
 
 
93
#define APC_F_PERCENT   0x020000 /* Data in a percent format */
 
94
#define APC_F_VOLT      0x030000 /* Data in a voltage format */
 
95
#define APC_F_AMP       0x040000 /* Data in a current/amp format */
 
96
#define APC_F_CELSIUS   0x050000 /* Data in a temp/C format */
 
97
#define APC_F_HEX       0x060000 /* Data in a hex number format */
 
98
#define APC_F_DEC       0x070000 /* Data in a decimal format */
 
99
#define APC_F_SECONDS   0x100000 /* Time in seconds */
 
100
#define APC_F_MINUTES   0x110000 /* Time in minutes */
 
101
#define APC_F_HOURS     0x120000 /* Time in hours */
 
102
#define APC_F_REASON    0x130000 /* Reason of transfer */
 
103
#define APC_F_LEAVE     0       /* Just pass this through */
 
104
 
 
105
typedef struct {
 
106
        const   char    *name;          /* the variable name */
 
107
        unsigned int    flags;          /* various flags                */
 
108
        char            cmd;            /* command character */
 
109
} apc_vartab_t;
 
110
 
 
111
apc_vartab_t    apc_vartab[] = {
 
112
 
 
113
        { "ups.firmware.old",   0,                      'V' },
 
114
        { "ups.firmware",       0,                      'b' },
 
115
        { "ups.firmware.aux",   0,                      'v' },
 
116
        { "ups.model",          0,                      0x01 },
 
117
 
 
118
        { "ups.serial",         0,                      'n' },
 
119
        { "ups.mfr.date",       0,                      'm' },
 
120
 
 
121
        { "ups.temperature",    APC_POLL|APC_F_CELSIUS, 'C' },
 
122
        { "ups.load",           APC_POLL|APC_F_PERCENT, 'P' },
 
123
 
 
124
        { "ups.test.interval",  APC_F_HOURS,            'E' },
 
125
        { "ups.test.result",    APC_POLL,               'X' },
 
126
 
 
127
        { "ups.delay.start",    APC_F_SECONDS,          'r' },
 
128
        { "ups.delay.shutdown", APC_F_SECONDS,          'p' },
 
129
 
 
130
        { "ups.id",             APC_STRING,             'c' },
 
131
 
 
132
        { "ups.contacts",       APC_POLL|APC_F_HEX,     'i' },
 
133
        { "ups.display.language",
 
134
                                0,                      0x0C },
 
135
 
 
136
        { "input.voltage",      APC_POLL|APC_F_VOLT,    'L' },
 
137
        { "input.frequency",    APC_POLL|APC_F_DEC,     'F' },
 
138
        { "input.sensitivity",  0,                      's' },
 
139
        { "input.quality",      APC_POLL|APC_F_HEX,     '9' },
 
140
 
 
141
        { "input.transfer.low", APC_F_VOLT,             'l' },
 
142
        { "input.transfer.high",
 
143
                                APC_F_VOLT,             'u' },
 
144
        { "input.transfer.reason", 
 
145
                                APC_POLL|APC_F_REASON,  'G' },
 
146
 
 
147
        { "input.voltage.maximum",
 
148
                                APC_POLL|APC_F_VOLT,    'M' },
 
149
        { "input.voltage.minimum",
 
150
                                APC_POLL|APC_F_VOLT,    'N' },
 
151
 
 
152
        { "output.current",     APC_POLL|APC_F_AMP,     '/' },
 
153
        { "output.voltage",     APC_POLL|APC_F_VOLT,    'O' },
 
154
        { "output.voltage.nominal",  
 
155
                                APC_F_VOLT,             'o' },
 
156
 
 
157
        { "ambient.humidity",   APC_POLL|APC_F_PERCENT, 'h' },
 
158
        { "ambient.humidity.high", 
 
159
                                APC_F_PERCENT,          '{' },
 
160
        { "ambient.humidity.low", 
 
161
                                APC_F_PERCENT,          '}' },
 
162
 
 
163
        { "ambient.temperature",        
 
164
                                APC_POLL|APC_F_CELSIUS, 't' },
 
165
        { "ambient.temperature.high",   
 
166
                                APC_F_CELSIUS,          '[' },
 
167
        { "ambient.temperature.low",    
 
168
                                APC_F_CELSIUS,          ']' },
 
169
 
 
170
        { "battery.date",       APC_STRING,             'x' },
 
171
 
 
172
        { "battery.charge",     APC_POLL|APC_F_PERCENT, 'f' },
 
173
        { "battery.charge.restart",  
 
174
                                APC_F_PERCENT,          'e' },
 
175
 
 
176
        { "battery.voltage",    APC_POLL|APC_F_VOLT,    'B' },
 
177
        { "battery.voltage.nominal", 
 
178
                                0,                      'g' },
 
179
 
 
180
        { "battery.runtime",    APC_POLL|APC_F_MINUTES, 'j' },
 
181
        { "battery.runtime.low",
 
182
                                APC_F_MINUTES,          'q' },
 
183
 
 
184
        { "battery.packs",      APC_F_DEC,              '>' },
 
185
        { "battery.packs.bad",  APC_F_DEC,              '<' },
 
186
        { "battery.alarm.threshold", 
 
187
                                0,                      'k' },
 
188
        /* todo:
 
189
 
 
190
           I = alarm enable (hex field) - split into alarm.n.enable
 
191
           J = alarm status (hex field) - split into alarm.n.status
 
192
 
 
193
        0x15 = output voltage selection (APC_F_VOLT)
 
194
        0x5C = load power (APC_POLL|APC_F_PERCENT)
 
195
 
 
196
         */
 
197
 
 
198
        {NULL,          0,                              0},
 
199
};
 
200
 
 
201
/* ------ instant commands ------ */
 
202
 
 
203
#define APC_CMD_FPTEST          'A'
 
204
#define APC_CMD_CALTOGGLE       'D'
 
205
#define APC_CMD_SHUTDOWN        'K'
 
206
#define APC_CMD_SOFTDOWN        'S'
 
207
#define APC_CMD_GRACEDOWN       '@'
 
208
#define APC_CMD_SIMPWF          'U'
 
209
#define APC_CMD_BTESTTOGGLE     'W'
 
210
#define APC_CMD_OFF             'Z'
 
211
 
 
212
#define APC_CMD_ON              0x0E            /* ^N */
 
213
#define APC_CMD_BYPTOGGLE       '^'
 
214
 
 
215
typedef struct {
 
216
        const   char    *name;
 
217
        int     flags;
 
218
        char    cmd;
 
219
} apc_cmdtab_t;
 
220
 
 
221
apc_cmdtab_t    apc_cmdtab[] =
 
222
{
 
223
        { "load.off",           APC_NASTY|APC_REPEAT,   APC_CMD_OFF       },
 
224
        { "load.on",            APC_REPEAT,             APC_CMD_ON        },
 
225
 
 
226
        { "test.panel.start",   0,                      APC_CMD_FPTEST    },
 
227
 
 
228
        { "test.failure.start", 0,                      APC_CMD_SIMPWF    },
 
229
 
 
230
        { "test.battery.start", 0,                      APC_CMD_BTESTTOGGLE },
 
231
        { "test.battery.stop",  0,                      APC_CMD_BTESTTOGGLE },
 
232
 
 
233
        { "shutdown.return.grace",
 
234
                                APC_NASTY,              APC_CMD_GRACEDOWN  },
 
235
        { "shutdown.return",    APC_NASTY,              APC_CMD_SOFTDOWN  },
 
236
        { "shutdown.stayoff",   APC_NASTY|APC_REPEAT,   APC_CMD_SHUTDOWN  },
 
237
 
 
238
        { "calibrate.start",    0,                      APC_CMD_CALTOGGLE },
 
239
        { "calibrate.stop",     0,                      APC_CMD_CALTOGGLE },
 
240
 
 
241
        { "bypass.start",       0,                      APC_CMD_BYPTOGGLE },
 
242
        { "bypass.stop",        0,                      APC_CMD_BYPTOGGLE },
 
243
 
 
244
        { NULL, 0, 0                                    }
 
245
};
 
246
 
 
247
/* compatibility with hardware that doesn't do APC_CMDSET ('a') */
 
248
 
 
249
struct {
 
250
        const   char    *firmware;
 
251
        const   char    *cmdchars;
 
252
        int     flags;
 
253
} compat_tab[] = {
 
254
        /* APC Matrix */
 
255
        { "0XI",        "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 },
 
256
        { "0XM",        "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 },
 
257
        { "0ZI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
 
258
        { "5UI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
 
259
        { "5ZM",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 },
 
260
        /* APC600 */
 
261
        { "6QD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
262
        { "6QI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
263
        { "6TD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
264
        { "6TI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
265
        /* SmartUPS 900 */
 
266
        { "7QD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
267
        { "7QI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
268
        { "7TD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
269
        { "7TI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
270
        /* SmartUPS 900I */
 
271
        { "7II",        "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
 
272
        /* SmartUPS 2000I */
 
273
        { "9II",        "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
 
274
        { "9GI",        "79ABCEFGKLMNOPQSUVWXYZcfg", 0 },
 
275
        /* SmartUPS 1250 */
 
276
        { "8QD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
277
        { "8QI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
278
        { "8TD",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
279
        { "8TI",        "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 },
 
280
        /* CS 350 */
 
281
        { "5.4.D",      "\1ABPQRSUYbdfgjmnx9",  0 },
 
282
        /* Smart-UPS 600 */
 
283
        {  "D9",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
284
        {  "D8",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
285
        {  "D7",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
286
        {  "D6",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
287
        {  "D5",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
288
        {  "D4",        "789ABCEFGKLMNOPQRSUVWXYZ", 0 },
 
289
 
 
290
        { NULL,         NULL,                   0 },
 
291
};