1 #ifndef MICRODOWELL_H 2 #define MICRODOWELL_H 3 4 #ifdef ENTERPRISE_PROTOCOL 5 6 #include <ctype.h> 7 #include "nut_stdint.h" 8 9 #define STX_CHAR '[' 10 #define ERR_COM_NO_CHARS -999 // nessun carattere dalla porta seriale 11 #define ERR_MSG_TOO_SHORT -998 // messaggio troppo breve: non arriva sino al Checksum 12 #define ERR_MSG_CHECKSUM -997 // checksum non valido 13 #define ERR_COM_TIMEOUT -996 // timeout in lettura 14 #define ERR_CLR_RX_BUFF -900 // bisogna cancellare il buffer (non è un errore!) 15 #define COMMAND_NOT_VALID -50 // comando non valido 16 #define PARAMETER_NOT_VALID -51 // parametro non valido 17 #define ERR_UPS_NOT_FOUND -10 // non trovo un UPS 18 #define ERR_COM_PORT_OPEN -11 // impossibile aprire la porta di comunicazione 19 #define ERR_COM_SET_PORT -12 // impossibile configurare la porta di comunicazione 20 #define ERR_COM_UNDEF_PORT -20 // porta non valida o non esistente 21 #define ERR_USB_DRIVER -13 // impossibile aprire il driver USB 22 #define ERR_USB_COMM_KO -14 // interfaccia USB OK: gruppo spento o guasto 23 #define ERR_UPS_UNKNOWN -30 // impossibile identificare l'UPS 24 #define ERR_PRG_THREAD -40 // impossibile creare uno thread 25 #define ERR_PRG_INVALID_DATA -60 // dati non validi 26 27 #define ERR_NO_ERROR 0x00 // no errors 28 #define ERR_I2C_BUSY 0x01 // I2C bus busy (e2prom) 29 #define ERR_CMD_CHECKSUM 0x10 // Checksum not valid 30 #define ERR_CMD_UNRECOG 0x11 // unrecognized command 31 #define ERR_EEP_NOBLOCK 0x08 // WRITE: eeprom address not multiple of 8 32 #define ERR_EEP_OOBOUND 0x09 // READ: eeprom address out of bound (with size) 33 #define ERR_EEP_WADDR1 0x28 // error writing e2prom address 34 #define ERR_EEP_WSADDR1 0x29 // error writing e2prom subaddress 35 #define ERR_EEP_RDATA 0x2A // error reading e2prom data 36 #define ERR_EEP_WADDR2 0x50 // error writing e2prom address 37 #define ERR_EEP_WSADDR2 0x51 // error reading e2prom subaddress 38 #define ERR_EEP_WDATA 0x52 // error writing e2prom data 39 #define ERR_EEP_WADDRVER 0x53 // error writing e2prom address during data verification 40 #define ERR_EEP_WDATAVER 0x54 // error verification e2prom data 41 #define ERR_EEP_VERIFY 0x55 // e2prom data are different from those in the write buffer 42 #define ERR_EEP_CHECKSUM 0x90 // e2prom checksum error 43 44 45 46 #define CMD_ACK 0x06 // ACK 47 #define CMD_NACK 0x15 // NACK 48 49 #define CMD_GET_STATUS 0x00 // comando di acquisizione STATUS 50 #define CMD_GET_MEASURES 0x01 // comando di acquisizione MISURE 51 #define CMD_GET_CONFIG 0x02 // comando di acquisizione CONFIGURAZIONE 52 #define CMD_GET_BATT_STAT 0x03 // comando di acquisizione Battery+Load Status 53 #define CMD_GET_BAT_LD 0x03 // comando di acquisizione Battery+Load Status 54 #define CMD_GET_MASK 0x07 // comando di acquisizione MASCHERA PUNTI 55 #define CMD_SET_TIMER 0x20 // comando di CONFIGURAZIONE TIMER 56 #define CMD_BATT_TEST 0x21 // comando di CONFIGURAZIONE TEST BATTERIA 57 #define CMD_GET_BATT_TEST 0x22 // comando di LETTURA TEST BATTERIA 58 #define CMD_SD_ONESHOT 0x40 // comando di SCRITTURA SHUTDOWN ONESHOT 59 #define CMD_GET_SD_ONESHOT 0x41 // comando di LETTURA SHUTDOWN ONESHOT 60 #define CMD_SET_SCHEDULE 0x42 // comando di SCRITTURA SCHEDULE 61 #define CMD_GET_SCHEDULE 0x43 // comando di LETTURA SCHEDULE 62 #define CMD_GET_EEP_BLOCK 0x50 // comando di LETTURA BLOCCO EEPROM 63 #define CMD_SET_EEP_BLOCK 0x51 // comando di SCRITTURA BLOCCO EEPROM 64 #define CMD_GET_EEP_SEED 0x52 // comando di acquisizione SEME PROGR. EEPROM 65 #define CMD_INIT 0xF0 // comando di REINIZIALIZZAZIONE UPS 66 67 68 #define LEN_ACK 1 // ACK 69 #define LEN_NACK 2 // NACK 70 71 #define LEN_GET_STATUS 1 // comando di acquisizione STATUS 72 #define LEN_GET_MEASURES 1 // comando di acquisizione MISURE 73 #define LEN_GET_CONFIG 1 // comando di acquisizione CONFIGURAZIONE 74 #define LEN_GET_BATT_STAT 1 // comando di acquisizione Battery+Load Status 75 #define LEN_GET_BAT_LD 1 // comando di acquisizione Battery+Load Status 76 #define LEN_GET_MASK 1 // comando di acquisizione MASCHERA PUNTI 77 #define LEN_SET_TIMER 5 // comando di CONFIGURAZIONE TIMER 78 #define LEN_BATT_TEST 4 // comando di CONFIGURAZIONE TEST BATTERIA 79 #define LEN_GET_BATT_TEST 1 // comando di LETTURA TEST BATTERIA 80 #define LEN_SD_ONESHOT 8 // comando di SCRITTURA SHUTDOWN ONESHOT 81 #define LEN_GET_SD_ONESHOT 1 // comando di LETTURA SHUTDOWN ONESHOT 82 #define LEN_SET_SCHEDULE 8 // comando di SCRITTURA SCHEDULE 83 #define LEN_GET_SCHEDULE 2 // comando di LETTURA SCHEDULE 84 #define LEN_GET_EEP_BLOCK 3 // comando di SCRITTURA BLOCCO EEPROM 85 #define LEN_SET_EEP_BLOCK 12 // comando di SCRITTURA BLOCCO EEPROM 86 #define LEN_GET_EEP_SEED 1 // comando di acquisizione SEME PROGR. EEPROM 87 #define LEN_INIT 1 // comando di REINIZIALIZZAZIONE UPS 88 89 90 // non completamente definiti! 91 #define RET_GET_STATUS 10 // comando di acquisizione STATUS 92 #define RET_GET_MEASURES 15 // comando di acquisizione MISURE 93 #define RET_GET_CONFIG 11 // comando di acquisizione CONFIGURAZIONE 94 #define RET_GET_BATT_STAT 10 // comando di acquisizione Battery+Load Status 95 #define RET_GET_BAT_LD 10 // comando di acquisizione Battery+Load Status 96 #define RET_GET_MASK 1 // comando di acquisizione MASCHERA PUNTI 97 #define RET_SET_TIMER 5 // comando di CONFIGURAZIONE TIMER 98 #define RET_BATT_TEST 4 // comando di CONFIGURAZIONE TEST BATTERIA 99 #define RET_GET_BATT_TEST 1 // comando di LETTURA TEST BATTERIA 100 #define RET_SD_ONESHOT 8 // comando di SCRITTURA SHUTDOWN ONESHOT 101 #define RET_GET_SD_ONESHOT 1 // comando di LETTURA SHUTDOWN ONESHOT 102 #define RET_SET_SCHEDULE 8 // comando di SCRITTURA SCHEDULE 103 #define RET_GET_SCHEDULE 8 // comando di LETTURA SCHEDULE 104 #define RET_GET_EEP_BLOCK 11 // comando di SCRITTURA BLOCCO EEPROM 105 #define RET_SET_EEP_BLOCK 12 // comando di SCRITTURA BLOCCO EEPROM 106 #define RET_GET_EEP_SEED 1 // comando di acquisizione SEME PROGR. EEPROM 107 #define RET_INIT 1 // comando di REINIZIALIZZAZIONE UPS 108 109 110 //======================================================= 111 // Indirizzi delle variabili memorizzate nella EEPROM: // 112 //======================================================= 113 #define EEP_OPT_BYTE_BLK 0x00 // Option Bytes block 114 #define EEP_MAGIC 0x00 // magic number: deve essere a 0xAA 115 #define EEP_CHECKSUM 0x01 // XOR longitudinale da 0x?? a 0x?? 116 #define EEP_OUT_CONFIG 0x02 // vedi documentazione 117 #define EEP_OPT_BYTE_0 0x02 // vedi documentazione 118 #define EEP_OPT_BYTE_1 0x03 // vedi documentazione 119 #define EEP_STATUS 0x04 // Status UPS 120 121 #define EEP_THRESHOLD_0 0x08 // Blocco 0 con gli threshold 122 #define EEP_MEAN_MIN 0x08 // UPS minimum AC voltage intervention point 123 #define EEP_MEAN_MAX 0x0A // UPS maximum AC voltage intervention point 124 #define EEP_AVR_MIN 0x0C // AVR minimum AC voltage intervention point 125 #define EEP_AVR_MAX 0x0E // AVR maximum AC voltage intervention point 126 127 #define EEP_THRESHOLD_1 0x10 // Blocco 1 con gli threshold 128 #define EEP_BLOW_VALUE 0x10 // Battery LOW threshold voltage 129 #define EEP_BEND_VALUE 0x12 // Battery END threshold voltage 130 #define EEP_VMETER_0 0x14 // Led 0 Voltage indicator threshold 131 #define EEP_VMETER_1 0x16 // Led 1 Voltage indicator threshold 132 133 #define EEP_THRESHOLD_2 0x18 // Blocco 2 con gli threshold 134 #define EEP_VMETER_2 0x18 // Led 2 Voltage indicator threshold 135 #define EEP_VMETER_3 0x1A // Led 3 Voltage indicator threshold 136 #define EEP_VMETER_4 0x1C // Led 4 Voltage indicator threshold 137 138 #define EEP_FAULT_POINTS 0x20 // number of fault points (in an half sine wave) after which USP enter battery mode 139 #define EEP_CHARGER_MIN 0x21 // Threshold voltage for battery charger 140 141 #define EEP_TEMP_MAX 0x28 // Maximum temperature: over this value an alarm will be generated 142 #define EEP_TEMP_FAULT 0x2A // Fault temperature: over this value, UPS will shut down immediately 143 #define EEP_FANSPEED_0 0x2C // Temperature for fan activation (low speed) 144 #define EEP_FANSPEED_1 0x2E // Temperature for fan activation (medium speed) 145 146 #define EEP_FANSPEED_2 0x30 // Temperature for fan activation (high speed) 147 148 #define EEP_IOUT 0x38 // 149 #define EEP_IOUT_OVRLD 0x38 // Maximum current: over this value an alarm will be generated 150 #define EEP_IOUT_FAULT 0x3A // Fault current: over this value, UPS will shut down immediately 151 #define EEP_PWRMTR_0 0x3C // Led 0 Power indicator threshold 152 #define EEP_PWRMTR_1 0x3E // Led 1 Power indicator threshold 153 154 #define EEP_PWRMTR_2 0x40 // Led 2 Power indicator threshold 155 #define EEP_PWRMTR_3 0x42 // Led 3 Power indicator threshold 156 #define EEP_PWRMTR_4 0x44 // Led 4 Power indicator threshold 157 #define EEP_PWRMTR_5 0x46 // Between "Full power" and "Overload" Power indicator level 158 159 #define EEP_INPUT_MASK_0 0x48 // Half sine input mask (0-7 of 10 points) 160 #define EEP_INPUT_MASK_8 0x50 // Half sine input mask (8-9 of 10 points) 161 162 #define EEP_MIN_VBATT 0x60 // Minimum battery voltaged reached from the last power-on 163 #define EEP_RUNTIME_H 0x62 // Working time in minutes (max ~=32 years) (MSB first) 164 #define EEP_BAT_TIME_M 0x65 // Time in Battery mode: seconds*2 (max ~=390 days). (MSB first) 165 166 167 #define EEP_UPS_MODEL 0x80 // Model of the UPS in ASCII. For the Enterprise line, the structure is: 168 // ENTxxyyy 169 // where: xx = Power rating in watts/100 (zero padded at left) 170 // yyy = model variants (if not defined, space padded to the right) 171 172 #define EEP_NETWRK_ID 0x88 // Network ID in ASCII (not used) - space padded 173 #define EEP_NETWRK_NAME 0x90 // Network Name in ASCII (not used) - space padded 174 #define EEP_SERIAL_NUM 0x98 // Serial Number in ASCII - zero padded (at left) 175 176 #define EEP_PROD_DATE 0xA0 // 177 #define EEP_PROD_YEAR 0xA0 // Year of production (add 2000) 178 #define EEP_PROD_WEEK 0xA1 // Week of production [0-51] 179 #define EEP_PROD_HW_VER 0xA2 // Hardware version: 2 nibbles ? Major and Minor number. 180 #define EEP_PROD_BRD_VER 0xA3 // Board version: 2 nibbles ? Major and Minor number. 181 #define EEP_PROD_FW_VER 0xA4 // Firmware version: 2 nibbles ? Major and Minor number. 182 #define EEP_PROD_FW_SVER 0xA5 // Firmware SUBversion: 2 nibbles ? Major and Minor number. 183 #define EEP_PROD_BTTRS 0xA6 // number of batteries installed in the UPS 184 185 186 #define EEP_BATT_SUBST 0xA8 // battery replacement block 187 #define EEP_BATT_YEAR_0 0xA8 // Year of 1st battery replacement (add 2000) 188 #define EEP_BATT_WEEK_0 0xA9 // Week of 1st battery replacement 189 #define EEP_BATT_YEAR_1 0xAA // Year of 2nd battery replacement (add 2000) 190 #define EEP_BATT_WEEK_1 0xAB // Week of 2nd battery replacement 191 #define EEP_BATT_YEAR_2 0xAC // Year of 3rd battery replacement (add 2000) 192 #define EEP_BATT_WEEK_2 0xAD // Week of 3rd battery replacement 193 #define EEP_BATT_YEAR_3 0xAE // Year of 4th battery replacement (add 2000) 194 #define EEP_BATT_WEEK_3 0xAF // Week of 4th battery replacement 195 196 197 #define EEP_SCHEDULE 0xC8 // Start of SCHEDULING table 198 #define EEP_SCHEDULE_0 0xC8 // 1st Scheduling slot 199 #define EEP_SCHEDULE_1 0xD0 // 2nd Scheduling slot 200 #define EEP_SCHEDULE_2 0xD8 // 3rd Scheduling slot 201 #define EEP_SCHEDULE_3 0xE0 // 4th Scheduling slot 202 #define EEP_SCHEDULE_4 0xE8 // 5th Scheduling slot 203 #define EEP_SCHEDULE_5 0xF0 // 6th Scheduling slot 204 205 206 #define BIT_NO_COMM_UPS 0x0001 // Event 2 - communications with the UPS lost 207 #define BIT_COMM_OK 0x0002 // Event 3 - communications with the UPS reestablished 208 #define BIT_BATTERY_MODE 0x0004 // Event 5 - the UPS is in Battery mode 209 #define BIT_BATTERY_LOW 0x0008 // Event 6 - the UPS has a LOW battery level 210 #define BIT_MAINS_OK 0x0010 // Event 7 - return of the mains 211 #define BIT_OVERLOAD 0x0020 // Event 8 - the UPS is overloaded 212 #define BIT_HIGH_TEMPERATURE 0x0040 // Event 9 - the UPS is in overtemperature 213 #define BIT_GENERIC_FAULT 0x0080 // Event 11 - there is a generic fault 214 #define BIT_SYSTEM_SHUTDOWN 0x0100 // Event 14 - the UPS will shut down IMMEDIATELY 215 #define BIT_STANDBY 0x0200 // Event 32 - the UPS went in STANDBY MODE 216 #define BIT_BATTERY_END 0x0400 // Event 33 - the UPS went in battery END 217 #define BIT_EVENT_0 0x1000 // evento ?? 218 #define BIT_EVENT_1 0x2000 // evento ?? 219 #define BIT_FIRST_TIME 0x4000 // se è la prima volta che chiamo la funzione 220 #define BIT_POLL_RESTART 0x8000 // se riesco ad identificare l'UPS dopo lo scollegamento, reinvio i dati 221 222 223 224 typedef struct 225 { 226 int Port ; // porta a cui è collegato l' UPS: 227 // 0 = USB 228 // n = COMn 229 char Opened ; // BOOL flag che identifica se la porta è aperta 230 int ErrCode ; // ultimo codice di errore in fase di lettura 231 int ErrCount ; // conteggio degli errori 232 unsigned char PollFlag ; // identifica se posso accedere all'UPS 233 // 0x01: se TRUE, polling abilitato 234 // 0x02: se TRUE, la routine di polling dati è attiva: devo attendere 235 // 0x04: se TRUE, bisogna rileggere la configurazione del gruppo 236 //------------------------------------------------------------------------ 237 unsigned long Counter ; // contatore: viene incrementato ad ogni nuovo POLL 238 unsigned char CommStatus ; // stato delle comunicazioni 239 //unsigned char FramePointer ; 240 size_t FramePointer ; // puntatore al carattere di START dei dati ricevuti 241 //------------------------------------------------------------------------ 242 char UpsModel[9] ; // modello UPS (8 caratteri) 243 unsigned char ge_2kVA ; // if more or equal to 2KVA 244 char SerialNumber[9] ; // numero di serie dell'UPS 245 246 unsigned short int YearOfProd ; // anno di produzione dell'UPS 247 unsigned char MonthOfProd ; // Mese di produzione dell'UPS 248 unsigned char DayOfProd ; // Giorno di produzione dell'UPS 249 unsigned char HW_MajorVersion ; // Hardware: Major version 250 unsigned char HW_MinorVersion ; // Hardware: Minor version 251 unsigned char BR_MajorVersion ; // BoardHardware: Major version 252 unsigned char BR_MinorVersion ; // BoardHardware: Minor version 253 unsigned char FW_MajorVersion ; // Firmware: Major version 254 unsigned char FW_MinorVersion ; // Firmware: Minor version 255 unsigned char FW_SubVersion ; // Firmware: SUBVERSION (special releases 256 // for particular customers) 257 258 unsigned char BatteryNumber ; // number of batteries in UPS 259 //------------------------------------------------------------------------ 260 uint32_t StatusUPS ; // flag di stato dell'UPS 4 byte): 1=TRUE 261 // bit 0 => BATTERY_MODE 262 // bit 1 => BATTERY_LOW 263 // bit 2 => BATTERY_END 264 // bit 3 => ONLINE (funzionamento in rete) 265 // bit 4 => MAINS_ON (rete di ingresso presente) 266 // bit 5 => STANDBY (UPS in modo Standby) 267 // bit 6 => WAIT_MAINS (UPS in fase di INIT + attesa rete) 268 // bit 7 => INIT (UPS in fase di inizializzazione) 269 // ------ 270 // bit 8 => MASK_OK (semionda OK) 271 // bit 9 => MEAN_OK (media tensione di ingresso OK) 272 // bit 10 => SYNC_OK (sincronizzazione semionda OK) 273 // bit 11 => FAULT (generico) 274 // bit 12 => TEMP_MAX (superato livello critico di temperatura) 275 // bit 13 => TEMP_FAULT (Fault da temperatura: UPS si spegne) 276 // bit 14 => LOAD_MAX (soglia overload superata) 277 // bit 15 => LOAD_FAULT (Fault da carico: UPS si spegne) 278 // ------ 279 // bit 16 => INV_FAULT (Fault dell'inverter) 280 // bit 17 => IINV_MAX (eccessiva corrente sull'inverter) 281 // bit 18 => IINV_FAULT (Fault sulla corrente inverter: l'UPS si spegne) 282 // bit 19 => 50_60Hz (1=60Hz) 283 // bit 20 => EEP_FAULT (problemi con la EEPROM) 284 // bit 21 => VOUT_FAULT (tensione uscita troppo bassa) 285 // bit 22 => - non definito - 286 // bit 23 => - non definito - 287 // ------ 288 // bit 24 to 31 => - NON DEFINITI - 289 290 uint16_t ShortStatus ; // the LSB 2 bytes of the status 291 unsigned char OutConfig ; // stato uscite UPS 292 float Vinput ; // tensione di INPUT in 1/10 di Volt 293 float Voutput ; // tensione di OUTPUT in 1/10 di Volt 294 float Temp ; // temperatura in 1/10 di grado 295 float InpFreq ; // Frequenza di INPUT in 1/10 di Hz 296 float OutFreq ; // Frequenza di OUTPUT in 1/10 di Hz 297 float OutCurrent ; // Corrente di Output in 1/10 di A 298 unsigned char LoadPerc ; // Percentuale di carico 299 unsigned short int LoadVA ; // Carico in VA 300 float ChgCurrent ; // corrente carica batterie 301 302 float Vbatt ; // tensione delle batterie in 1/10 di Volt 303 unsigned char PercBatt ; // percentuale di carica della batteria 304 unsigned short int RtimeEmpty; // minuti alla scarica della batteria 305 unsigned char PercEmpty ; // percentuale alla scarica: 0%=scarica, 100%=carica 306 unsigned char OutStatus ; // stato delle uscite 307 308 unsigned char Year ; // 309 unsigned char Month ; // 310 unsigned char Day ; // 311 unsigned char WeekDay ; // Giorno della settimana 312 unsigned char Hour ; // Ora 313 unsigned char Min ; // minuti 314 unsigned char Sec ; // secondi 315 316 unsigned char BattLowPerc ; // percentuale carica batteria quando va in BLOW 317 unsigned long Rtime ; // numero di minuti di accensione dell'UPS 318 unsigned long RtimeBatt ; // numero di secondi*2 in modalità batteria dall'accensione 319 //------------------------------------------------------------------------ 320 unsigned int ShutdownDelay ; // Shutdown delay in seconds 321 unsigned int WakeUpDelay ; // WakeUp delay in seconds 322 } ENT_STRUCT ; 323 324 #endif // ENTERPRISE_PROTOCOL 325 326 #endif 327