nut/drivers/microdowell.h

328 lines
18 KiB
C
Raw Permalink Normal View History

2010-03-25 23:20:59 +00:00
#ifndef MICRODOWELL_H
#define MICRODOWELL_H
#ifdef ENTERPRISE_PROTOCOL
#include <ctype.h>
#define STX_CHAR '['
#define ERR_COM_NO_CHARS -999 // nessun carattere dalla porta seriale
#define ERR_MSG_TOO_SHORT -998 // messaggio troppo breve: non arriva sino al Checksum
#define ERR_MSG_CHECKSUM -997 // checksum non valido
#define ERR_COM_TIMEOUT -996 // timeout in lettura
#define ERR_CLR_RX_BUFF -900 // bisogna cancellare il buffer (non è un errore!)
#define COMMAND_NOT_VALID -50 // comando non valido
#define PARAMETER_NOT_VALID -51 // parametro non valido
#define ERR_UPS_NOT_FOUND -10 // non trovo un UPS
#define ERR_COM_PORT_OPEN -11 // impossibile aprire la porta di comunicazione
#define ERR_COM_SET_PORT -12 // impossibile configurare la porta di comunicazione
#define ERR_COM_UNDEF_PORT -20 // porta non valida o non esistente
#define ERR_USB_DRIVER -13 // impossibile aprire il driver USB
#define ERR_USB_COMM_KO -14 // interfaccia USB OK: gruppo spento o guasto
#define ERR_UPS_UNKNOWN -30 // impossibile identificare l'UPS
#define ERR_PRG_THREAD -40 // impossibile creare uno thread
#define ERR_PRG_INVALID_DATA -60 // dati non validi
#define ERR_NO_ERROR 0x00 // no errors
#define ERR_I2C_BUSY 0x01 // I2C bus busy (e2prom)
#define ERR_CMD_CHECKSUM 0x10 // Checksum not valid
#define ERR_CMD_UNRECOG 0x11 // unrecognized command
#define ERR_EEP_NOBLOCK 0x08 // WRITE: eeprom address not multiple of 8
#define ERR_EEP_OOBOUND 0x09 // READ: eeprom address out of bound (with size)
#define ERR_EEP_WADDR1 0x28 // error writing e2prom address
#define ERR_EEP_WSADDR1 0x29 // error writing e2prom subaddress
#define ERR_EEP_RDATA 0x2A // error reading e2prom data
#define ERR_EEP_WADDR2 0x50 // error writing e2prom address
#define ERR_EEP_WSADDR2 0x51 // error reading e2prom subaddress
#define ERR_EEP_WDATA 0x52 // error writing e2prom data
#define ERR_EEP_WADDRVER 0x53 // error writing e2prom address during data verification
#define ERR_EEP_WDATAVER 0x54 // error verification e2prom data
#define ERR_EEP_VERIFY 0x55 // e2prom data are different from those in the write buffer
#define ERR_EEP_CHECKSUM 0x90 // e2prom checksum error
#define CMD_ACK 0x06 // ACK
#define CMD_NACK 0x15 // NACK
#define CMD_GET_STATUS 0x00 // comando di acquisizione STATUS
#define CMD_GET_MEASURES 0x01 // comando di acquisizione MISURE
#define CMD_GET_CONFIG 0x02 // comando di acquisizione CONFIGURAZIONE
#define CMD_GET_BATT_STAT 0x03 // comando di acquisizione Battery+Load Status
#define CMD_GET_BAT_LD 0x03 // comando di acquisizione Battery+Load Status
#define CMD_GET_MASK 0x07 // comando di acquisizione MASCHERA PUNTI
#define CMD_SET_TIMER 0x20 // comando di CONFIGURAZIONE TIMER
#define CMD_BATT_TEST 0x21 // comando di CONFIGURAZIONE TEST BATTERIA
#define CMD_GET_BATT_TEST 0x22 // comando di LETTURA TEST BATTERIA
#define CMD_SD_ONESHOT 0x40 // comando di SCRITTURA SHUTDOWN ONESHOT
#define CMD_GET_SD_ONESHOT 0x41 // comando di LETTURA SHUTDOWN ONESHOT
#define CMD_SET_SCHEDULE 0x42 // comando di SCRITTURA SCHEDULE
#define CMD_GET_SCHEDULE 0x43 // comando di LETTURA SCHEDULE
#define CMD_GET_EEP_BLOCK 0x50 // comando di LETTURA BLOCCO EEPROM
#define CMD_SET_EEP_BLOCK 0x51 // comando di SCRITTURA BLOCCO EEPROM
#define CMD_GET_EEP_SEED 0x52 // comando di acquisizione SEME PROGR. EEPROM
#define CMD_INIT 0xF0 // comando di REINIZIALIZZAZIONE UPS
#define LEN_ACK 1 // ACK
#define LEN_NACK 2 // NACK
#define LEN_GET_STATUS 1 // comando di acquisizione STATUS
#define LEN_GET_MEASURES 1 // comando di acquisizione MISURE
#define LEN_GET_CONFIG 1 // comando di acquisizione CONFIGURAZIONE
#define LEN_GET_BATT_STAT 1 // comando di acquisizione Battery+Load Status
#define LEN_GET_BAT_LD 1 // comando di acquisizione Battery+Load Status
#define LEN_GET_MASK 1 // comando di acquisizione MASCHERA PUNTI
#define LEN_SET_TIMER 5 // comando di CONFIGURAZIONE TIMER
#define LEN_BATT_TEST 4 // comando di CONFIGURAZIONE TEST BATTERIA
#define LEN_GET_BATT_TEST 1 // comando di LETTURA TEST BATTERIA
#define LEN_SD_ONESHOT 8 // comando di SCRITTURA SHUTDOWN ONESHOT
#define LEN_GET_SD_ONESHOT 1 // comando di LETTURA SHUTDOWN ONESHOT
#define LEN_SET_SCHEDULE 8 // comando di SCRITTURA SCHEDULE
#define LEN_GET_SCHEDULE 2 // comando di LETTURA SCHEDULE
#define LEN_GET_EEP_BLOCK 3 // comando di SCRITTURA BLOCCO EEPROM
#define LEN_SET_EEP_BLOCK 12 // comando di SCRITTURA BLOCCO EEPROM
#define LEN_GET_EEP_SEED 1 // comando di acquisizione SEME PROGR. EEPROM
#define LEN_INIT 1 // comando di REINIZIALIZZAZIONE UPS
// non completamente definiti!
#define RET_GET_STATUS 10 // comando di acquisizione STATUS
#define RET_GET_MEASURES 15 // comando di acquisizione MISURE
#define RET_GET_CONFIG 11 // comando di acquisizione CONFIGURAZIONE
#define RET_GET_BATT_STAT 10 // comando di acquisizione Battery+Load Status
#define RET_GET_BAT_LD 10 // comando di acquisizione Battery+Load Status
#define RET_GET_MASK 1 // comando di acquisizione MASCHERA PUNTI
#define RET_SET_TIMER 5 // comando di CONFIGURAZIONE TIMER
#define RET_BATT_TEST 4 // comando di CONFIGURAZIONE TEST BATTERIA
#define RET_GET_BATT_TEST 1 // comando di LETTURA TEST BATTERIA
#define RET_SD_ONESHOT 8 // comando di SCRITTURA SHUTDOWN ONESHOT
#define RET_GET_SD_ONESHOT 1 // comando di LETTURA SHUTDOWN ONESHOT
#define RET_SET_SCHEDULE 8 // comando di SCRITTURA SCHEDULE
#define RET_GET_SCHEDULE 8 // comando di LETTURA SCHEDULE
#define RET_GET_EEP_BLOCK 11 // comando di SCRITTURA BLOCCO EEPROM
#define RET_SET_EEP_BLOCK 12 // comando di SCRITTURA BLOCCO EEPROM
#define RET_GET_EEP_SEED 1 // comando di acquisizione SEME PROGR. EEPROM
#define RET_INIT 1 // comando di REINIZIALIZZAZIONE UPS
//=======================================================
// Indirizzi delle variabili memorizzate nella EEPROM: //
//=======================================================
#define EEP_OPT_BYTE_BLK 0x00 // Option Bytes block
#define EEP_MAGIC 0x00 // magic number: deve essere a 0xAA
#define EEP_CHECKSUM 0x01 // XOR longitudinale da 0x?? a 0x??
#define EEP_OUT_CONFIG 0x02 // vedi documentazione
#define EEP_OPT_BYTE_0 0x02 // vedi documentazione
#define EEP_OPT_BYTE_1 0x03 // vedi documentazione
#define EEP_STATUS 0x04 // Status UPS
#define EEP_THRESHOLD_0 0x08 // Blocco 0 con gli threshold
#define EEP_MEAN_MIN 0x08 // UPS minimum AC voltage intervention point
#define EEP_MEAN_MAX 0x0A // UPS maximum AC voltage intervention point
#define EEP_AVR_MIN 0x0C // AVR minimum AC voltage intervention point
#define EEP_AVR_MAX 0x0E // AVR maximum AC voltage intervention point
#define EEP_THRESHOLD_1 0x10 // Blocco 1 con gli threshold
#define EEP_BLOW_VALUE 0x10 // Battery LOW threshold voltage
#define EEP_BEND_VALUE 0x12 // Battery END threshold voltage
#define EEP_VMETER_0 0x14 // Led 0 Voltage indicator threshold
#define EEP_VMETER_1 0x16 // Led 1 Voltage indicator threshold
#define EEP_THRESHOLD_2 0x18 // Blocco 2 con gli threshold
#define EEP_VMETER_2 0x18 // Led 2 Voltage indicator threshold
#define EEP_VMETER_3 0x1A // Led 3 Voltage indicator threshold
#define EEP_VMETER_4 0x1C // Led 4 Voltage indicator threshold
#define EEP_FAULT_POINTS 0x20 // number of fault points (in an half sine wave) after which USP enter battery mode
#define EEP_CHARGER_MIN 0x21 // Threshold voltage for battery charger
#define EEP_TEMP_MAX 0x28 // Maximum temperature: over this value an alarm will be generated
#define EEP_TEMP_FAULT 0x2A // Fault temperature: over this value, UPS will shut down immediately
#define EEP_FANSPEED_0 0x2C // Temperature for fan activation (low speed)
#define EEP_FANSPEED_1 0x2E // Temperature for fan activation (medium speed)
#define EEP_FANSPEED_2 0x30 // Temperature for fan activation (high speed)
#define EEP_IOUT 0x38 //
#define EEP_IOUT_OVRLD 0x38 // Maximum current: over this value an alarm will be generated
#define EEP_IOUT_FAULT 0x3A // Fault current: over this value, UPS will shut down immediately
#define EEP_PWRMTR_0 0x3C // Led 0 Power indicator threshold
#define EEP_PWRMTR_1 0x3E // Led 1 Power indicator threshold
#define EEP_PWRMTR_2 0x40 // Led 2 Power indicator threshold
#define EEP_PWRMTR_3 0x42 // Led 3 Power indicator threshold
#define EEP_PWRMTR_4 0x44 // Led 4 Power indicator threshold
#define EEP_PWRMTR_5 0x46 // Between "Full power" and "Overload" Power indicator level
#define EEP_INPUT_MASK_0 0x48 // Half sine input mask (0-7 of 10 points)
#define EEP_INPUT_MASK_8 0x50 // Half sine input mask (8-9 of 10 points)
#define EEP_MIN_VBATT 0x60 // Minimum battery voltaged reached from the last power-on
#define EEP_RUNTIME_H 0x62 // Working time in minutes (max ~=32 years) (MSB first)
#define EEP_BAT_TIME_M 0x65 // Time in Battery mode: seconds*2 (max ~=390 days). (MSB first)
#define EEP_UPS_MODEL 0x80 // Model of the UPS in ASCII. For the Enterprise line, the structure is:
// ENTxxyyy
// where: xx = Power rating in watts/100 (zero padded at left)
// yyy = model variants (if not defined, space padded to the right)
#define EEP_NETWRK_ID 0x88 // Network ID in ASCII (not used) - space padded
#define EEP_NETWRK_NAME 0x90 // Network Name in ASCII (not used) - space padded
#define EEP_SERIAL_NUM 0x98 // Serial Number in ASCII - zero padded (at left)
#define EEP_PROD_DATE 0xA0 //
#define EEP_PROD_YEAR 0xA0 // Year of production (add 2000)
#define EEP_PROD_WEEK 0xA1 // Week of production [0-51]
#define EEP_PROD_HW_VER 0xA2 // Hardware version: 2 nibbles ? Major and Minor number.
#define EEP_PROD_BRD_VER 0xA3 // Board version: 2 nibbles ? Major and Minor number.
#define EEP_PROD_FW_VER 0xA4 // Firmware version: 2 nibbles ? Major and Minor number.
#define EEP_PROD_FW_SVER 0xA5 // Firmware SUBversion: 2 nibbles ? Major and Minor number.
#define EEP_PROD_BTTRS 0xA6 // number of batteries installed in the UPS
#define EEP_BATT_SUBST 0xA8 // battery replacement block
#define EEP_BATT_YEAR_0 0xA8 // Year of 1st battery replacement (add 2000)
#define EEP_BATT_WEEK_0 0xA9 // Week of 1st battery replacement
#define EEP_BATT_YEAR_1 0xAA // Year of 2nd battery replacement (add 2000)
#define EEP_BATT_WEEK_1 0xAB // Week of 2nd battery replacement
#define EEP_BATT_YEAR_2 0xAC // Year of 3rd battery replacement (add 2000)
#define EEP_BATT_WEEK_2 0xAD // Week of 3rd battery replacement
#define EEP_BATT_YEAR_3 0xAE // Year of 4th battery replacement (add 2000)
#define EEP_BATT_WEEK_3 0xAF // Week of 4th battery replacement
#define EEP_SCHEDULE 0xC8 // Start of SCHEDULING table
#define EEP_SCHEDULE_0 0xC8 // 1st Scheduling slot
#define EEP_SCHEDULE_1 0xD0 // 2nd Scheduling slot
#define EEP_SCHEDULE_2 0xD8 // 3rd Scheduling slot
#define EEP_SCHEDULE_3 0xE0 // 4th Scheduling slot
#define EEP_SCHEDULE_4 0xE8 // 5th Scheduling slot
#define EEP_SCHEDULE_5 0xF0 // 6th Scheduling slot
#define BIT_NO_COMM_UPS 0x0001 // Event 2 - communications with the UPS lost
#define BIT_COMM_OK 0x0002 // Event 3 - communications with the UPS reestablished
#define BIT_BATTERY_MODE 0x0004 // Event 5 - the UPS is in Battery mode
#define BIT_BATTERY_LOW 0x0008 // Event 6 - the UPS has a LOW battery level
#define BIT_MAINS_OK 0x0010 // Event 7 - return of the mains
#define BIT_OVERLOAD 0x0020 // Event 8 - the UPS is overloaded
#define BIT_HIGH_TEMPERATURE 0x0040 // Event 9 - the UPS is in overtemperature
#define BIT_GENERIC_FAULT 0x0080 // Event 11 - there is a generic fault
#define BIT_SYSTEM_SHUTDOWN 0x0100 // Event 14 - the UPS will shut down IMMEDIATELY
#define BIT_STANDBY 0x0200 // Event 32 - the UPS went in STANDBY MODE
#define BIT_BATTERY_END 0x0400 // Event 33 - the UPS went in battery END
#define BIT_EVENT_0 0x1000 // evento ??
#define BIT_EVENT_1 0x2000 // evento ??
#define BIT_FIRST_TIME 0x4000 // se è la prima volta che chiamo la funzione
#define BIT_POLL_RESTART 0x8000 // se riesco ad identificare l'UPS dopo lo scollegamento, reinvio i dati
typedef struct
{
int Port ; // porta a cui è collegato l' UPS:
// 0 = USB
// n = COMn
char Opened ; // BOOL flag che identifica se la porta è aperta
int ErrCode ; // ultimo codice di errore in fase di lettura
int ErrCount ; // conteggio degli errori
unsigned char PollFlag ; // identifica se posso accedere all'UPS
// 0x01: se TRUE, polling abilitato
// 0x02: se TRUE, la routine di polling dati è attiva: devo attendere
// 0x04: se TRUE, bisogna rileggere la configurazione del gruppo
//------------------------------------------------------------------------
unsigned long Counter ; // contatore: viene incrementato ad ogni nuovo POLL
unsigned char CommStatus ; // stato delle comunicazioni
unsigned char FramePointer ; // puntatore al carattere di START dei dati ricevuti
//------------------------------------------------------------------------
char UpsModel[9] ; // modello UPS (8 caratteri)
unsigned char ge_2kVA ; // if more or equal to 2KVA
char SerialNumber[9] ; // numero di serie dell'UPS
unsigned short int YearOfProd ; // anno di produzione dell'UPS
unsigned char MonthOfProd ; // Mese di produzione dell'UPS
unsigned char DayOfProd ; // Giorno di produzione dell'UPS
unsigned char HW_MajorVersion ; // Hardware: Major version
unsigned char HW_MinorVersion ; // Hardware: Minor version
unsigned char BR_MajorVersion ; // BoardHardware: Major version
unsigned char BR_MinorVersion ; // BoardHardware: Minor version
unsigned char FW_MajorVersion ; // Firmware: Major version
unsigned char FW_MinorVersion ; // Firmware: Minor version
unsigned char FW_SubVersion ; // Firmware: SUBVERSION (special releases
// for particular customers)
unsigned char BatteryNumber ; // number of batteries in UPS
//------------------------------------------------------------------------
unsigned long StatusUPS ; // flag di stato dell'UPS 4 byte): 1=TRUE
// bit 0 => BATTERY_MODE
// bit 1 => BATTERY_LOW
// bit 2 => BATTERY_END
// bit 3 => ONLINE (funzionamento in rete)
// bit 4 => MAINS_ON (rete di ingresso presente)
// bit 5 => STANDBY (UPS in modo Standby)
// bit 6 => WAIT_MAINS (UPS in fase di INIT + attesa rete)
// bit 7 => INIT (UPS in fase di inizializzazione)
// ------
// bit 8 => MASK_OK (semionda OK)
// bit 9 => MEAN_OK (media tensione di ingresso OK)
// bit 10 => SYNC_OK (sincronizzazione semionda OK)
// bit 11 => FAULT (generico)
// bit 12 => TEMP_MAX (superato livello critico di temperatura)
// bit 13 => TEMP_FAULT (Fault da temperatura: UPS si spegne)
// bit 14 => LOAD_MAX (soglia overload superata)
// bit 15 => LOAD_FAULT (Fault da carico: UPS si spegne)
// ------
// bit 16 => INV_FAULT (Fault dell'inverter)
// bit 17 => IINV_MAX (eccessiva corrente sull'inverter)
// bit 18 => IINV_FAULT (Fault sulla corrente inverter: l'UPS si spegne)
// bit 19 => 50_60Hz (1=60Hz)
// bit 20 => EEP_FAULT (problemi con la EEPROM)
// bit 21 => VOUT_FAULT (tensione uscita troppo bassa)
// bit 22 => - non definito -
// bit 23 => - non definito -
// ------
// bit 24 to 31 => - NON DEFINITI -
unsigned short int ShortStatus ; // the LSB 2 bytes of the status
unsigned char OutConfig ; // stato uscite UPS
float Vinput ; // tensione di INPUT in 1/10 di Volt
float Voutput ; // tensione di OUTPUT in 1/10 di Volt
float Temp ; // temperatura in 1/10 di grado
float InpFreq ; // Frequenza di INPUT in 1/10 di Hz
float OutFreq ; // Frequenza di OUTPUT in 1/10 di Hz
float OutCurrent ; // Corrente di Output in 1/10 di A
unsigned char LoadPerc ; // Percentuale di carico
unsigned short int LoadVA ; // Carico in VA
float ChgCurrent ; // corrente carica batterie
float Vbatt ; // tensione delle batterie in 1/10 di Volt
unsigned char PercBatt ; // percentuale di carica della batteria
unsigned short int RtimeEmpty; // minuti alla scarica della batteria
unsigned char PercEmpty ; // percentuale alla scarica: 0%=scarica, 100%=carica
unsigned char OutStatus ; // stato delle uscite
unsigned char Year ; //
unsigned char Month ; //
unsigned char Day ; //
unsigned char WeekDay ; // Giorno della settimana
unsigned char Hour ; // Ora
unsigned char Min ; // minuti
unsigned char Sec ; // secondi
unsigned char BattLowPerc ; // percentuale carica batteria quando va in BLOW
unsigned long Rtime ; // numero di minuti di accensione dell'UPS
unsigned long RtimeBatt ; // numero di secondi*2 in modalità batteria dall'accensione
//------------------------------------------------------------------------
unsigned int ShutdownDelay ; // Shutdown delay in seconds
unsigned int WakeUpDelay ; // WakeUp delay in seconds
} ENT_STRUCT ;
#endif // ENTERPRISE_PROTOCOL
#endif