/***************************************************************************
                          knutclient.cpp  -  description
                             -------------------
    begin                : Út srp 21 19:12:20 CEST 2001
    copyright            : (C) 2001 by Daniel Prynych
    email                : Daniel.Prynych@alo.cz
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "knutupsdata.h"
#include "knutvardata.h"
#include "knutprefdlg.h"
#include "knutprintupsvar.h"
#include "knutinstcomms.h"
#include "knutrwvar.h"
#include "knutclient.h"

#include <qdatetime.h>
#include <qmutex.h>

#include <kconfig.h>
#include <ksimpleconfig.h>

#include <unistd.h>  // for function sleep and other ...



#include <iostream>

//  const char *nameUpsVars1[] = {
//  "NONE", "UTILITY", "BATTPCT", "UPSTEMP", "ACFREQ", "LOADPCT", "AMBTEMP", "AMBHUMID","BATTVOLT","OUTVOLT",CURRENT};
//  const char *nameUpsVars2[] = {
//    "none", "input.voltage", "battery.charge", "ups.temperature", "input.frequency", "ups.load", "ambient.temperature",
//"ambient.humidity","battery.voltage","output.voltage","output.current","battery.temperature","battery.current"};

  extern const char *nameUpsVars1[];
  extern const char *nameUpsVars2[];

KNutClient::KNutClient(bool noDock, QObject* parent, const char *name) : QObject(parent, name) {


  upsRecords = new KNutUpsData();
  analogRecords = new KNutVarData();

  upsTimer = new QTimer (this);
  connect( upsTimer, SIGNAL(timeout()), SLOT(slotTimeout()) );

  reconnectTimer = new QTimer(this);
  connect( reconnectTimer, SIGNAL(timeout()), SLOT(slotReconnectTimeout()) );

  
  //  data pro combo
  listKNutEvent = new QStringList();
  
  // inicializace a natazeni configurace;
  initVars();

  loadConfiguration();
  
  if (!noDock) {
    myDock = new KNutDock(&mainUpsInfo,&settingData,upsRecords);
    
    myDock->show();
    connect(myDock, SIGNAL(endApplication()), this, SLOT(slotExitApplication()));
    connect(myDock, SIGNAL(activeMainWindow()), this, SLOT(activeMainWindow()));
    connect(myDock, SIGNAL(minimize()), this, SLOT(minimizeMainWindow()));
    connect(myDock, SIGNAL(UPSChanged(QString)), this, SLOT(slotSetNewUPS (QString)));

    connect(myDock, SIGNAL(preferences()),this, SLOT(slotPreferenceUps()));
    connect(myDock, SIGNAL(printUPSVars()),this, SLOT(slotPrintUPSVars()));
    connect(myDock, SIGNAL(instComms()),this, SLOT(slotInstComms()));
    connect(myDock, SIGNAL(RWVars()),this, SLOT(slotRWVars()));
    connect(myDock, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection()));
    }
  
  addEventString(i18n("Ready."));

 
  // nastavime data pro vybranou polozku
  // sets data for selected item
  setActiveUpsInfo(mainUpsInfo.record.name);

  // sets mainUpsInfo.oldState to const value KNutNet::initStatus
  mainUpsInfo.oldState=KNutNet::initState;
  
  //makes connect to UPS, connection is non blocking operation
  //we have to use signal firstConnection and connectionError from KNutNet class 
  mainUpsInfo.upsNet = new KNutNet( mainUpsInfo.record.upsAddress,mainUpsInfo.record.upsName,mainUpsInfo.record.port,5,200);
  
  connect(mainUpsInfo.upsNet, SIGNAL(firstConnection(void)),this, SLOT(slotFirstConnection(void)));
  connect(mainUpsInfo.upsNet, SIGNAL(connectionError(int)),this, SLOT(slotErrorConnection(int)));
  connect(mainUpsInfo.upsNet, SIGNAL(connectionClosed(void )),this, SLOT(slotConnectionClosed(void)));
  connect(mainUpsInfo.upsNet, SIGNAL(tryFirstConnection(int )),this, SLOT(slotTryFirstConnection(int)));
  connect(mainUpsInfo.upsNet, SIGNAL(tryRepeatFirstConnection(int )),this, SLOT(slotTryReepatFirstConnection( int )));
    

// state of connection to usbd, this isn't state of knutnet
//  if (mainUpsInfo.record.upsName !="") {
//    mainUpsInfo.upsDriverState=knc::connecting;
 //   }
 // else   mainUpsInfo.upsDriverState=knc::notConnected;
  
 // repaints the dock
  if (myDock) myDock->clearDockValues();
    
  if (settingData.useMainWindow || noDock) makeMainWindow ();

  if (myDock) myMessMan = new KNutMessageManager(this);
 
  //tries connecting to server
  mainUpsInfo.upsDriverState=knc::connecting;
  mainUpsInfo.upsNet->open();
  }

  
KNutClient::~KNutClient(void) {

  if (myMessMan) delete myMessMan;

  // melo by uz byt zruseno - jistota
  if (myDock) { myDock->close(); myDock=0l;}
  
  if (mainUpsInfo.upsNet) {
  // melo by uz byt zruseno - jistota
    delete mainUpsInfo.upsNet;
    mainUpsInfo.upsNet = 0;
    }
  listKNutEvent->clear();
  delete listKNutEvent;

  // melo by uz byt zruseno - jistota
  if (mainWindow) delete mainWindow;

  delete upsRecords;
  delete analogRecords;
  }


  
void KNutClient::slotTryFirstConnection (int maxCount) {

 //std::cout << "--KNutClient::slotTryFirstConnection"  << std::endl;

  // repaints icon 
  if (myDock) myDock->repaintDock(true);
  if (mainWindow) mainWindow->startConnectPB(maxCount);
  }  

void KNutClient::slotTryReepatFirstConnection (int number ) {


  //std::cout << "--slotTryReepatFirstConnection " << number << std::endl;

  if (mainWindow) mainWindow->setProgressConnectPB (number); 
  }
  
    
void KNutClient::slotFirstConnection (void) {
 //std::cout << "--KNutClient::slotFirstConnection"  << std::endl;

  mainUpsInfo.reconnecting =false;
  reconnectTimer->stop();
  mainUpsInfo.nutVariables = mainUpsInfo.upsNet->getNutVariables();
  mainUpsInfo.nutProtocol = mainUpsInfo.upsNet->getNutProtocol();

  if (mainWindow) mainWindow->hideConnectPB();
  
  
  // reads UPS's variables
  int countRevision = 2; // pocet max opakovani po kterych muzeme zjistovat hodnoty
   do {
 //std::cout << "--KNutClient::slotFirstConnection before getUpsVar calling"  << std::endl;
    if (!(mainUpsInfo.netError = mainUpsInfo.upsNet->getUpsVars())) break;  
 //std::cout << "--KNutClient::slotFirstConnection error " << mainUpsInfo.netError  << std::endl;
    if (mainUpsInfo.netError == KNutNet::UnknownUps) break;
    if (mainUpsInfo.netError == KNutNet::DriverNotConnected) break;
    countRevision--;
    if (countRevision) sleep (2);
    }
  while (countRevision);

  if (mainUpsInfo.netError) {
    mainUpsInfo.errorUpsData=true;
    // mainUpsInfo.upsDriverState is state of connection to usbd, this isn't state of knutnet
    if (mainUpsInfo.netError == KNutNet::DriverNotConnected)
      mainUpsInfo.upsDriverState=knc::notConnected;
    else
      mainUpsInfo.upsDriverState=knc::error;
    if (myDock) myDock->repaintDock(true);
    addEventString (KNutVarData::errorToText(mainUpsInfo.netError),mainUpsInfo.record.name);
    KNutVarData::showError (mainUpsInfo.netError);
    }
  else {
    mainUpsInfo.upsDriverState=knc::connected;

    switch (mainUpsInfo.nutVariables) { // type of variables, old or new (with dot)
        case 1:
          if (!(mainUpsInfo.upsNet->existName("BATT_RUNTIME"))) mainUpsInfo.runtimeVar="BATT_RUNTIME";
          else mainUpsInfo.runtimeVar="RUNTIME";
          mainUpsInfo.upsLoadVar="LOADPCT";
          mainUpsInfo.lowxferVar="LOWXFER";
          mainUpsInfo.highxferVar="HIGHXFER";
          mainUpsInfo.statusVar="STATUS";
        break;
        case 2:
          mainUpsInfo.runtimeVar="battery.runtime";
          mainUpsInfo.upsLoadVar="ups.load";
          mainUpsInfo.lowxferVar="input.transfer.low";
          mainUpsInfo.highxferVar="input.transfer.high";
          mainUpsInfo.statusVar="ups.status";
       }

    if ((settingData.useDescription) && (!mainUpsInfo.upsNet->isDescription())) mainUpsInfo.upsNet->getDescription();
      // test presunut do setActiveUpsVars
    if (mainWindow) setActiveUpsVars(true);
    else setActiveUpsVars(false);
    
    // repaints main window and dock immediately
    if (mainWindow) mainWindow->showUpsData();
//    if (myDock) myDock->repaintDock(mainUpsInfo.netError,true); // dock is repainting always
    if (myDock) myDock->repaintDock(true); // dock is repainting always
    
    panelsAreZeroing=false; // analog panels isn't setting to zero
    }

//std::cout << "--KNutClient::slotFirstConnection end"  << std::endl;    
// tato cast tato cast je presunuta z konstruktoru     
  if ((mainUpsInfo.upsNet->getState() == KNutNet::Connected) && (!mainUpsInfo.errorUpsData)) {
    showStatusEvent();
    // getUpsVars loads informations about variables, but their values too
    upsTimer->start( mainUpsInfo.record.delay, TRUE ); // nastartujeme casovac - starts timer
    }
  }  

  
void KNutClient::slotErrorConnection (int error) {
//  std::cout << "--KNutClient::slotErrorConnection"  << std::endl;

  if (mainWindow) mainWindow->hideConnectPB();
    
  mainUpsInfo.netError = error;
  mainUpsInfo.errorUpsData=true;
  if (mainUpsInfo.netError == KNutNet::DriverNotConnected)
    mainUpsInfo.upsDriverState=knc::notConnected;
  else
    mainUpsInfo.upsDriverState=knc::error;
  if (myDock) myDock->repaintDock(true);    
    
  if (mainUpsInfo.reconnecting) {
    mainUpsInfo.reconnectCount++;
    if (mainUpsInfo.reconnectCount > countNextConnDelay) mainUpsInfo.reconnectCount = countNextConnDelay;
    
    addEventString(i18n("The connection failed. The next connection will make after %1 sec.").arg(nextConnDelay[mainUpsInfo.reconnectCount-1]),mainUpsInfo.record.name);
    reconnectTimer->start( nextConnDelay[mainUpsInfo.reconnectCount-1]*1000, TRUE ); // starts reconnect timer again
    }
  else {  
    addEventString (KNutVarData::errorToText(mainUpsInfo.netError),mainUpsInfo.record.name);
    KNutVarData::showError (mainUpsInfo.netError);
    }  
  }
  
  
    
void KNutClient::initVars (void) {
// Nasledujici data jsou nastavena pri natazeni konfigurace
  settingData.panelFlags = KNutFrontPanel::DefaultPanelFlags; // informace v hlavnim panelu
  settingData.toolTipFlags = KNutDock::DefaultToolTipFlags; // informace v hlavnim panelu

  mainUpsInfo.record.name="";
  mainUpsInfo.upsNet=0L;
  mainUpsInfo.netError=0; // no error zadna chyba 
  mainUpsInfo.name="";
  mainUpsInfo.password="";
  mainUpsInfo.errorUpsData=false;
  mainUpsInfo.nutVariables=0;
  mainUpsInfo.runtimeVar="";
  mainUpsInfo.lowxferVar="";
  mainUpsInfo.highxferVar="";
  mainUpsInfo.statusVar="";
  mainUpsInfo.upsLoadVar="";
  mainUpsInfo.upsDriverState=knc::notConnected;
  mainUpsInfo.reconnectCount = 1;
  mainUpsInfo.reconnecting = false;
  
  panelsAreZeroing=false;
  lastError=0; // no error


  mainWindow=0;
  myDock=0;
  myMessMan=0;
  }


  void KNutClient::loadConfiguration ( void ) {
  QString groupName;
  upsRecord upsData; // struktura obsahuje udaje o UPS
  QFont appFont = kapp->font(); // systemovy font pri startu
  settingData.areYouSure=kapp->config()->readBoolEntry("AreYouSure",FALSE);
  settingData.useMainWindow=kapp->config()->readBoolEntry("UseMainWindow",TRUE);
  settingData.useMessageWindow=kapp->config()->readBoolEntry("UseMessageWindow",FALSE);
  settingData.x=kapp->config()->readNumEntry("PosX",0);
  settingData.y=kapp->config()->readNumEntry("PosY",0);
  settingData.width=kapp->config()->readNumEntry("Width",300);
  settingData.height=kapp->config()->readNumEntry("Height",200);
  settingData.useDescription=kapp->config()->readBoolEntry("UseDescription",FALSE);
  settingData.countCols=kapp->config()->readNumEntry("NumberOfCols",knc::DefaultCountCols);
  settingData.panelFlags=kapp->config()->readUnsignedNumEntry("PanelFlags",KNutFrontPanel::DefaultPanelFlags);
  settingData.inputFrequency=kapp->config()->readNumEntry("InputFrequency",knc::DefaultInputFrequency);
  settingData.inputVoltage=kapp->config()->readNumEntry("InputVoltage",knc::DefaultInputVoltage);
  settingData.lowHighXfer=kapp->config()->readBoolEntry("LowHighXfer",FALSE);
  settingData.customFont=kapp->config()->readBoolEntry("CustomFont",FALSE);
  settingData.aPanelFont=kapp->config()->readFontEntry("AnalogPanelFont",&appFont);
  settingData.mPanelFont=kapp->config()->readFontEntry("MainPanelFont",&appFont);
  int upsCount=kapp->config()->readNumEntry("NumberOfUpsRecords",0);
  settingData.customBColor=kapp->config()->readBoolEntry("CustomBColor",FALSE);
  settingData.mainBackgroundColor=kapp->config()->readColorEntry ("MainBackGroundColor",& DEFAULT_BG_COLOR);
  settingData.customBPanelColor=kapp->config()->readBoolEntry("CustomBPanelColor",FALSE);
  settingData.customBAnalogColor=kapp->config()->readBoolEntry("CustomBAnalogColor",FALSE);
  settingData.customOAnalogColor=kapp->config()->readBoolEntry("CustomOAnalogColor",FALSE);
  settingData.mPanelBackgroundColor=kapp->config()->readColorEntry ("MPanelBackGroundColor",& DEFAULT_BG_COLOR);
  settingData.aPanelBackgroundColor=kapp->config()->readColorEntry ("APanelBackGroundColor",& DEFAULT_BG_COLOR);
  settingData.analogFingerColor=kapp->config()->readColorEntry ("AnalogFingerColor",& DEFAULT_FINGER_COLOR);
  settingData.analogOKColor=kapp->config()->readColorEntry ("AnalogOKColor",& DEFAULT_OK_COLOR);
  settingData.analogWarnningColor=kapp->config()->readColorEntry ("AnalogWarnningColor",& DEFAULT_WARNNING_COLOR);
  settingData.analogErrorColor=kapp->config()->readColorEntry ("AnalogErrorColor",& DEFAULT_ERROR_COLOR);
  settingData.analogScaleColor=kapp->config()->readColorEntry ("AnalogScaleColor",& DEFAULT_SCALE_COLOR);
  settingData.analogFontColor=kapp->config()->readColorEntry ("AnalogFontColor",& DEFAULT_FONT_COLOR);
  settingData.toolTipFlags=kapp->config()->readUnsignedNumEntry("ToolTipFlags",KNutDock::DefaultToolTipFlags);
  settingData.customKIconColor=kapp->config()->readBoolEntry("CustomKIconColor",FALSE);
  settingData.kIconBackgroundColor=kapp->config()->readColorEntry ("KIconBackGroundColor",& DEFAULT_KICON_COLOR);
  settingData.typeOfKIcon=kapp->config()->readBoolEntry("TypeOfKIcon", KNutDock::pictureKI);

  mainUpsInfo.record.name=kapp->config()->readEntry("ActiveUps","");

  for (int i = 0; i < upsCount; i++) {
    groupName.sprintf ("UPS %d",i);
    kapp->config()->setGroup (groupName);
    if ((upsData.name = kapp->config()->readEntry ("Name")) != QChar::null) {
      // zaznam existuje pokracujeme dale
      upsData.upsName = kapp->config()->readEntry ("UpsName","");
      if (((upsData.upsAddress = kapp->config()->readEntry ("UpsAddress")) != QChar::null)
        || (( upsData.upsAddress == QChar::null)  &&    (upsData.upsName != QChar::null ))) {

        // only for backwards compatibility with older release then 0.7
        if (upsData.upsAddress.isEmpty()) {
          int charPos;
          if ((charPos=upsData.upsName.find('@')) == -1) {
            upsData.upsAddress=upsData.upsName;
            upsData.upsName="";
            }
          else {
            upsData.upsAddress=upsData.upsName.mid(charPos+1);
            upsData.upsName=upsData.upsName.left(charPos);
            }         
          }
        // zaznam existuje pokracujeme dale a nacteme zbytek hodnotet
        upsData.delay = kapp->config()->readNumEntry("Delay",knc::DefaultDelay);
        upsData.port = kapp->config()->readNumEntry("Port",knc::DefaultPort);
//        upsData.tcp = kapp->config()->readBoolEntry("Tcp",TRUE);
        upsData.userName=kapp->config()->readEntry("UserName","");
        upsData.password=kapp->config()->readEntry("Password","");
        upsData.savePassword=kapp->config()->readBoolEntry("SavePassword",false);
        for (int j=0; j < knc::NumberOfVars; j++) {
          groupName.sprintf ("Var %d",j);
          upsData.upsVarCode[j]=kapp->config()->readNumEntry (groupName,0);
          }
        upsRecords->add (upsData);
        }
      }
    }
  }

void KNutClient::saveConfiguration ( bool all ) {
  QString groupName;
  QString codeName;
  upsRecord upsData; // struktura obsahuje udaje o UPS structure includes information about UPS
  int upsCount = upsRecords->getCount();

  kapp->config()->setGroup ("");

  if (all) {
    kapp->config()->writeEntry ("TypeOfKIcon",settingData.typeOfKIcon);
    kapp->config()->writeEntry ("KIconBackGroundColor",settingData.kIconBackgroundColor);
    kapp->config()->writeEntry ("CustomKIconColor",(settingData.customKIconColor));
    kapp->config()->writeEntry ("ToolTipFlags",(settingData.toolTipFlags));
    }
  kapp->config()->writeEntry ("ActiveUps",(QString)mainUpsInfo.record.name); //

  if (all) {
    kapp->config()->writeEntry ("AnalogFontColor",settingData.analogFontColor);
    kapp->config()->writeEntry ("AnalogScaleColor",settingData.analogScaleColor);
    kapp->config()->writeEntry ("AnalogErrorColor",settingData.analogErrorColor);
    kapp->config()->writeEntry ("AnalogWarnningColor",settingData.analogWarnningColor);
    kapp->config()->writeEntry ("AnalogOKColor",settingData.analogOKColor);
    kapp->config()->writeEntry ("AnalogFingerColor",settingData.analogFingerColor);
    kapp->config()->writeEntry ("APanelBackGroundColor",settingData.aPanelBackgroundColor);
    kapp->config()->writeEntry ("MPanelBackGroundColor",settingData.mPanelBackgroundColor);
    kapp->config()->writeEntry ("MainBackGroundColor",settingData.mainBackgroundColor);
    kapp->config()->writeEntry ("NumberOfUpsRecords",upsCount);
    kapp->config()->writeEntry ("CustomFont",settingData.customFont);
    kapp->config()->writeEntry ("AnalogPanelFont",settingData.aPanelFont);
    kapp->config()->writeEntry ("MainPanelFont",settingData.mPanelFont);
    kapp->config()->writeEntry ("CustomBColor",(settingData.customBColor));
    kapp->config()->writeEntry ("CustomBPanelColor",(settingData.customBPanelColor));
    kapp->config()->writeEntry ("CustomBAnalogColor",(settingData.customBAnalogColor));
    kapp->config()->writeEntry ("CustomOAnalogColor",(settingData.customOAnalogColor));
    kapp->config()->writeEntry ("LowHighXfer",(settingData.lowHighXfer));
    kapp->config()->writeEntry ("InputVoltage",(settingData.inputVoltage));
    kapp->config()->writeEntry ("InputFrequency",(settingData.inputFrequency));
    kapp->config()->writeEntry ("PanelFlags",(settingData.panelFlags | 3));
    kapp->config()->writeEntry ("NumberOfCols",settingData.countCols);
    kapp->config()->writeEntry ("UseDescription",settingData.useDescription);
    kapp->config()->writeEntry ("AreYouSure",settingData.areYouSure);
    kapp->config()->writeEntry ("UseMainWindow",settingData.useMainWindow);
    kapp->config()->writeEntry ("UseMessageWindow",settingData.useMessageWindow);
    }
  kapp->config()->writeEntry ("Height",settingData.height); //
  kapp->config()->writeEntry ("Width",settingData.width); //
  kapp->config()->writeEntry ("PosY",settingData.y); //
  kapp->config()->writeEntry ("PosX",settingData.x); //

  if (all) {
    for (int i=0; i<upsCount; i++) {
      groupName.sprintf ("UPS %d",i);
      kapp->config()->setGroup (groupName);
      upsRecords->get(i,upsData);
//      kapp->config()->writeEntry ("Tcp",upsData.tcp);
      kapp->config()->writeEntry ("Port",upsData.port);
      kapp->config()->writeEntry ("Delay",upsData.delay);
      kapp->config()->writeEntry ("UpsAddress",upsData.upsAddress);
      kapp->config()->writeEntry ("UpsName",upsData.upsName);
      kapp->config()->writeEntry ("Name",upsData.name);
      if (upsData.savePassword) {
        kapp->config()->writeEntry ("UserName",upsData.userName);
        kapp->config()->writeEntry ("Password",upsData.password);
        }
      kapp->config()->writeEntry ("SavePassword",upsData.savePassword);
      for (int j=0; j < knc::NumberOfVars; j++) {
        groupName.sprintf ("Var %d",j);
        kapp->config()->writeEntry (groupName,upsData.upsVarCode[j]);
        }
      kapp->config()->setGroup ("");
      }
    }
  kapp->config()->sync();
  }


bool KNutClient::commitData (QSessionManager&) {

  saveConfiguration(false);
  return true;
  }

  bool KNutClient::saveState (QSessionManager&) {

  saveConfiguration(false);
  return true;
  }


  
void KNutClient::upsActivate (void) {

  mainUpsInfo.upsNet = new KNutNet( mainUpsInfo.record.upsAddress,mainUpsInfo.record.upsName,mainUpsInfo.record.port,0,1);
  if (mainUpsInfo.upsNet->getState() != KNutNet::Connected) {
    mainUpsInfo.netError=mainUpsInfo.upsNet->getError(); // aktivace ups skoncila s chybou
    KNutVarData::showError(mainUpsInfo.netError);
    mainUpsInfo.errorUpsData=true;
    mainUpsInfo.upsDriverState=knc::notConnected;
    }
  else {
    if (mainUpsInfo.upsNet->switchedToTCP())
      addEventString (i18n("upsd > 1.2 doesn't support UDP. Connection is switched to TCP"),mainUpsInfo.record.name);
    mainUpsInfo.nutVariables = mainUpsInfo.upsNet->getNutVariables();
    mainUpsInfo.nutProtocol = mainUpsInfo.upsNet->getNutProtocol();

    int countRevision = 2; // pocet max opakovani po kterych muzeme zjistovat hodnoty
    do {
      if (!(mainUpsInfo.netError = mainUpsInfo.upsNet->getUpsVars())) break;
      if (mainUpsInfo.netError == KNutNet::UnknownUps) break;
      if (mainUpsInfo.netError == KNutNet::DriverNotConnected) break;
      countRevision--;
      if (countRevision) sleep (2);
      }
    while (countRevision);
    
    if (mainUpsInfo.netError) {
       addEventString (KNutVarData::errorToText(mainUpsInfo.netError),mainUpsInfo.record.name);
       KNutVarData::showError (mainUpsInfo.netError);
       mainUpsInfo.errorUpsData=true;
       if (mainUpsInfo.netError == KNutNet::DriverNotConnected)
         mainUpsInfo.upsDriverState=knc::notConnected;
       else
         mainUpsInfo.upsDriverState=knc::error;
       }
    else {
      mainUpsInfo.upsDriverState=knc::connected;

      switch (mainUpsInfo.nutVariables) {
          case 1:
            if (!(mainUpsInfo.upsNet->existName("BATT_RUNTIME"))) mainUpsInfo.runtimeVar="BATT_RUNTIME";
            else mainUpsInfo.runtimeVar="RUNTIME";
            mainUpsInfo.upsLoadVar="LOADPCT";
            mainUpsInfo.lowxferVar="LOWXFER";
            mainUpsInfo.highxferVar="HIGHXFER";
            mainUpsInfo.statusVar="STATUS";
          break;
          case 2:
            mainUpsInfo.runtimeVar="battery.runtime";
            mainUpsInfo.upsLoadVar="ups.load";
            mainUpsInfo.lowxferVar="input.transfer.low";
            mainUpsInfo.highxferVar="input.transfer.high";
            mainUpsInfo.statusVar="ups.status";
         }

      if ((settingData.useDescription) && (!mainUpsInfo.upsNet->isDescription())) mainUpsInfo.upsNet->getDescription();
        // test presunut do setActiveUpsVars
      if (mainWindow) setActiveUpsVars(true);
      else setActiveUpsVars(false);
      }
    }
  }

void KNutClient::upsDeactivate (void) {

  // this function isn't interuptable function
//  upsDeactivateMutex.lock();
  QMutexLocker upsDeactivateLocker( &upsDeactivateMutex );
  mainUpsInfo.upsNet->close(); // close connection 
  // state of connection to usbd, this isn't state of knutnet 
  mainUpsInfo.upsDriverState=knc::notConnected;
  mainUpsInfo.netError=0; // no error
  mainUpsInfo.nutVariables=0;
//  upsDeactivateMutex.unlock();
  } 

void KNutClient::setActiveUpsVars (bool mWindow) {
  // nastavujeme jen pokud existuji nejake promene
  if ( mainUpsInfo.upsNet->readNumberVars() > 0) {
    // deaktivujeme veskere promene
    mainUpsInfo.upsNet->unSetActivateAll();

    if (mWindow) {
      for (int j=0; j < knc::NumberOfVars; j++) {
        switch (mainUpsInfo.nutVariables) {
          case 1:
            if (mainUpsInfo.record.upsVarCode[j] != 0 ) mainUpsInfo.upsNet->setActivate(nameUpsVars1[mainUpsInfo.record.upsVarCode[j]]);
          break;
          case 2:
            if (mainUpsInfo.record.upsVarCode[j] != 0 ) mainUpsInfo.upsNet->setActivate(nameUpsVars2[mainUpsInfo.record.upsVarCode[j]]);
          break;
          }
        }
      }
    mainUpsInfo.upsNet->setActivate(mainUpsInfo.runtimeVar); //runtime je vzdy pridano v merenym polozkam
    if (myDock) mainUpsInfo.upsNet->setActivate(mainUpsInfo.upsLoadVar);
    // status se nastavi vzdy
    mainUpsInfo.upsNet->setActivate(mainUpsInfo.statusVar);
    // xfer se nastavi vzdy pokud existuje
    // podrebujeme ho znat jeste pred startem a pak behen behu programu
    setActiveXFerVars(true);
    }
  }
  

void KNutClient::setActiveXFerVars (bool activate) {
  if (activate) {
    // podkud neexistuje jedna z promenych neaktivujeme ani jednu
    if (!(mainUpsInfo.upsNet->setActivate(mainUpsInfo.lowxferVar)))
      if (mainUpsInfo.upsNet->setActivate(mainUpsInfo.highxferVar))
        mainUpsInfo.upsNet->unSetActivate(mainUpsInfo.lowxferVar);
    }
  else {
    mainUpsInfo.upsNet->unSetActivate(mainUpsInfo.lowxferVar);
    mainUpsInfo.upsNet->unSetActivate(mainUpsInfo.highxferVar);
    }
  }

void KNutClient::setActiveUpsInfo (QString name) {
  //presuneme jmena  z databaze ups-ek - je nahrana z config. souboru
  upsRecord* upsRecordPointer;
  
  if ((!name.isNull()) && (!name.isEmpty()) && ((upsRecordPointer = upsRecords->findName(name)) != 0L)) {

    mainUpsInfo.record.upsName = upsRecordPointer->upsName;
    mainUpsInfo.record.upsAddress = upsRecordPointer->upsAddress;
    mainUpsInfo.record.delay = upsRecordPointer->delay;
    mainUpsInfo.record.port = upsRecordPointer->port;
//    mainUpsInfo.record.tcp = upsRecordPointer->tcp;
    mainUpsInfo.record.userName = upsRecordPointer->userName;
    mainUpsInfo.record.password = upsRecordPointer->password;
    for (int i =0; i < knc::NumberOfVars; i++) mainUpsInfo.record.upsVarCode[i] = 0; // vynulujeme polozky
    int ii = 0;
    for (int i =0; i < knc::NumberOfVars; i++)
      if (upsRecordPointer->upsVarCode[i]>0) mainUpsInfo.record.upsVarCode[ii++] = upsRecordPointer->upsVarCode[i];
    }       
  }


void KNutClient::getUpsData (void) {
  int runNetError;

  //loads values for selected variables <getUpsValues(false)>  / activate values
  if (!(runNetError=mainUpsInfo.upsNet->getUpsValues(false))) { // data from upsNet is ok
    // we read all values of UPS
    //  nacetli jsme vsechny hodnoty pro ups
    mainUpsInfo.netError=runNetError;
    if (mainUpsInfo.errorUpsData) { // changes status from error to ok
      mainUpsInfo.errorUpsData=false;
      addEventString (i18n("Data OK"),mainUpsInfo.record.name);
      if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("Data OK"),knc::errorLevel,true);
      }
    }
  else { // data from upsNet isn't ok
    mainUpsInfo.netError=runNetError;
    if (!mainUpsInfo.errorUpsData) { //change status from ok to error
      addEventString (KNutVarData::errorToText(runNetError),mainUpsInfo.record.name);
      if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(KNutVarData::errorToText(runNetError),knc::errorLevel);
      lastError=runNetError;
      mainUpsInfo.errorUpsData=true;
      }
    else {
      if (lastError != runNetError) { // change status from error to other error
        addEventString (KNutVarData::errorToText(runNetError),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(KNutVarData::errorToText(runNetError),knc::errorLevel);
        lastError=runNetError;
        }
      }    
    }
  }


void KNutClient::addEventString (const QString text, const QString UPSAddress) {

  if (mainWindow)
    mainWindow->addComboStatusItem (text,UPSAddress);
  else
    {
      QString dateTime(QDate::currentDate().toString());
      dateTime +=" " + QTime::currentTime().toString();
      if (UPSAddress.isEmpty()) listKNutEvent->append(dateTime+" "+text);
      else listKNutEvent->append(dateTime+" "+UPSAddress+" : "+text);
      if (listKNutEvent->count() > knc::maxCountKNutEvent) listKNutEvent->remove(listKNutEvent->begin());
      }
    }  
  
/*********************************************************************************************/
/*                                                                                           */
/*                             PRIVATE SLOTS                                                 */
/*                                                                                           */
/*********************************************************************************************/


void KNutClient::slotReconnectTimeout (void) {
//  std::cout << "KNutClient::ReconnectTimeout" << std::endl;  

    mainUpsInfo.netError=0; //clears netError
    mainUpsInfo.upsDriverState=knc::connecting;
    mainUpsInfo.upsNet->open();
  }


  
void KNutClient::slotTimeout (void) {
  
  getUpsData();
  if (!mainUpsInfo.errorUpsData) { // no error
    if (mainWindow) {
      mainWindow->repaintPanel();
      mainWindow->repaintAnalogs();
      }
    panelsAreZeroing=false;
    showStatusEvent();
    }
  else { // error
    if ((mainWindow) && (!panelsAreZeroing)) mainWindow->zeroingPanels();
    panelsAreZeroing=true;
    if (myDock) myDock->clearDockValues();
    }    
  if (myDock) myDock->repaintDock();
  upsTimer->start( mainUpsInfo.record.delay, TRUE ); // nastartujem znovu
  }


void KNutClient::slotConnectionClosed(void) {

  mainUpsInfo.netError = KNutNet::ConnetionClosedByServer;

//  std::cout << "-----KNutClient::slotConnectionClosed----" << std::endl;  
  upsTimer->stop();
  upsDeactivate();
  //sets netError this, because procedure upsDeactivate sets netError to zero
  mainUpsInfo.netError = KNutNet::ConnetionClosedByServer;
  
  if (mainWindow) {
    mainWindow->hideConnectPB();
    mainWindow->cleanPanels();    
    }
  if (myDock) {
    // clears values of dock and set standard icon of dock
   myDock->clearDockValues();
   }
  
  addEventString(i18n("The connection was closed by the second side (upsd)."),mainUpsInfo.record.name);
  if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("The connection was closed by the second side (upsd)."),knc::criticalLevel,true);

  mainUpsInfo.reconnecting = true;
  mainUpsInfo.reconnectCount = 1;
  reconnectTimer->start( nextConnDelay[0]*1000, TRUE ); // start timer for reconnect delay
  }  
  
void KNutClient::showStatusEvent(void) {

  int myState = mainUpsInfo.upsNet->readStatus();
  if (myState != mainUpsInfo.oldState) {
  
    if ((myState & KNutNet::OFF) != (mainUpsInfo.oldState & KNutNet::OFF)) {
      if (myState & KNutNet::OFF) {
        addEventString(i18n("UPS is off."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is off."),knc::criticalLevel);
        }
      else {
        addEventString(i18n("UPS is back on."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is back on."),knc::criticalLevel,true);
        }
      }
    if ((myState & KNutNet::OL) != (mainUpsInfo.oldState & KNutNet::OL)){
       if (myState & KNutNet::OL)  {
         addEventString(i18n("Power is back online."),mainUpsInfo.record.name);
         if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("Power is back online."),knc::warningLevel,true);
         }
       }
    if ((myState & KNutNet::OB) != (mainUpsInfo.oldState & KNutNet::OB)) {
      if (myState & KNutNet::OB)  {
        addEventString(i18n("UPS is on battery."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is on battery."),knc::warningLevel);
        }
      }
    if ((myState & KNutNet::LB) != (mainUpsInfo.oldState & KNutNet::LB)) {
      if (myState & KNutNet::LB) {
        addEventString(i18n("UPS battery is low."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS battery is low."),knc::criticalLevel);
        }
      else {
        addEventString(i18n("UPS battery is OK."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS battery is OK."),knc::criticalLevel,true);
        }
      }
    if ((myState & KNutNet::RB) != (mainUpsInfo.oldState & KNutNet::RB)) {
      if (myState & KNutNet::RB) {
        addEventString(i18n("UPS battery is bad and needs be replaced."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS battery is bad and needs be replaced."),knc::infoLevel);
        }
      }
    if ((myState & KNutNet::OVER) != (mainUpsInfo.oldState & KNutNet::OVER)) {
      if (myState & KNutNet::OVER) {
        addEventString(i18n("UPS is overloaded."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is overloaded."),knc::lowWarningLevel);
        }
      else {
        addEventString(i18n("UPS isn't overloaded."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS isn't overloaded."),knc::lowWarningLevel,true);
        }
      }
    if ((myState & KNutNet::CAL) != (mainUpsInfo.oldState & KNutNet::CAL)) {
      if (myState & KNutNet::CAL) {
        addEventString(i18n("UPS is performing calibration")+".",mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is performing calibration")+".",knc::infoLevel);
        }
      else {
        addEventString(i18n("Calibration of UPS is ended."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("Calibration of UPS is ended."),knc::infoLevel,true);
        }
      }
    if ((myState & KNutNet::BOOST) != (mainUpsInfo.oldState & KNutNet::BOOST)) {
      if (myState & KNutNet::BOOST) {
        addEventString(i18n("UPS is boosting incoming voltage."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is boosting incoming voltage."),knc::infoLevel);
        }
      else {
        addEventString(i18n("Boosting of UPS is ended."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("Boosting of UPS is ended."),knc::infoLevel,true);
        }
      }
    if ((myState & KNutNet::TRIM) != (mainUpsInfo.oldState & KNutNet::TRIM)) {
      if (myState & KNutNet::TRIM) {
        addEventString(i18n("UPS is trimming incoming voltage."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("UPS is trimming incoming voltage."),knc::infoLevel);
        }
      else {
        addEventString(i18n("Trimming of UPS is ended."),mainUpsInfo.record.name);
        if ((myMessMan) and (settingData.useMessageWindow)) myMessMan->addMessage(i18n("Trimming of UPS is ended."),knc::infoLevel,true);
        }
      }
    mainUpsInfo.oldState=myState;
    }
  }
  
void KNutClient::slotSetNewUPS (QString name) {

  mainUpsInfo.reconnecting =false;
  reconnectTimer->stop();

  if (name  != mainUpsInfo.record.name) {
    upsTimer->stop();
    upsDeactivate(); 
    
    addEventString(i18n("Switched"),name);
    if (myMessMan) myMessMan->deleteMessage();

    mainUpsInfo.record.name=name;
    mainUpsInfo.errorUpsData=false;
    setActiveUpsInfo(mainUpsInfo.record.name);

    if (mainWindow) {
      mainWindow->setCombo(name);
//      mainWindow->showUpsData();
      mainWindow->cleanPanels();    
      }
   
   if (myDock) {
      // clears values of dock and set standard icon of dock
     myDock->clearDockValues();
     myDock->setNewUPS(); // sets miniIcon in list of UPSes for selected UPS
     }
    
    panelsAreZeroing=false;
    lastError=0; // zadna chyba
    mainUpsInfo.oldState=KNutNet::initState; // init variable of last UPS state
    
    // nova cast
    
    mainUpsInfo.upsNet->newUPS(mainUpsInfo.record.upsAddress,mainUpsInfo.record.upsName, mainUpsInfo.record.port);
     // state of connection to usbd, this isn't state of knutnet
    mainUpsInfo.upsDriverState=knc::connecting;
    mainUpsInfo.upsNet->open();
    }  
  }

  
void KNutClient::slotPreferenceUps (void) {

  KNutPrefDlg* prefDlg = new KNutPrefDlg ( upsRecords, analogRecords, &settingData, mainUpsInfo.record.name ); // aktivujeme dialog pro preference
  connect (prefDlg,SIGNAL(signalChangeConfig(unsigned int)),this,SLOT(slotSetConfig(unsigned int)));
  prefDlg->exec();
  delete prefDlg;
  }


void KNutClient::slotSetConfig (unsigned int changeSetting) {

  if (changeSetting) {
    // cely blok konfiguraci ukladame jen zde
    saveConfiguration(true);
    if (changeSetting & KNutPrefDlg::ChangeXFer) {
      if (settingData.lowHighXfer)
        setActiveXFerVars(false);
      else
        setActiveXFerVars(true);
      }

    if (changeSetting & KNutPrefDlg::ChangeUpsSetting) {
//********** same code like into slotSetNewUPS -- stejny kod jako v slotSetNewUPS
      upsTimer->stop();
      upsDeactivate();

      if (mainUpsInfo.record.name == "") {
        QString name = upsRecords->getName(0);
        addEventString(i18n("Switched"),name);
        mainUpsInfo.record.name=name;
        mainUpsInfo.errorUpsData=false;
        myMessMan->deleteMessage();
        }
      else {
        if (upsRecords->getCount() == 0) {
          addEventString(i18n("Switched"),"");
          mainUpsInfo.record.name="";
          mainUpsInfo.errorUpsData=false;
          mainUpsInfo.record.upsName = "";
          mainUpsInfo.record.upsAddress = "";
          myMessMan->deleteMessage();
          }
        }
      setActiveUpsInfo(mainUpsInfo.record.name);
//      upsActivate();
//      getUpsData(); // provedeme hned natazeni zbytku promenych oby se nastavili meraky
                    // protoze UPS byla odpojena a znovu pripojena
      // zde je nutno hned provest prekresleni
      // showUpsData je nutno privect take proto ze se mohl zmenit vyber meraku
//      if (mainWindow) mainWindow->showUpsData();
      if (mainWindow) mainWindow->cleanPanels();
//      if (myDock) myDock->repaintDock(mainUpsInfo.netError);
      if (myDock) myDock->clearDockValues();

      mainUpsInfo.upsNet->newUPS(mainUpsInfo.record.upsAddress,mainUpsInfo.record.upsName, mainUpsInfo.record.port);
     // state of connection to usbd, this isn't state of knutnet
      mainUpsInfo.upsDriverState=knc::connecting;
      mainUpsInfo.upsNet->open();
//      if ((mainUpsInfo.upsNet->getState() == KNutNet::Connected) && (!mainUpsInfo.errorUpsData)) {
//        showStatusEvent();
//        upsTimer->start( mainUpsInfo.record.delay, TRUE ); // nastartujeme casovac
//        }
      }
    
    if (changeSetting & KNutPrefDlg::ChangeUpsCount) {
      if (myDock) myDock->changeUps();
      }

    if (changeSetting & KNutPrefDlg::ChangeTypeOfKIcon) {
      if (myDock) myDock->changeKIcon();
      }

    if (changeSetting & KNutPrefDlg::ChangeCustomKIconColor) {
      if (myDock) myDock->changeKIBColor();
      }

    if (changeSetting & KNutPrefDlg::ChangeKIconBColor) {
      if (myDock) myDock->changeKIBColor();
      }

    if (changeSetting & KNutPrefDlg::ChangeToolTip) {
      if (myDock) myDock->changeToolTip();
      }
                
    if (mainWindow) mainWindow->setConfig (changeSetting);
    }
  }


void KNutClient::slotPrintUPSVars(void) {

 if (mainUpsInfo.upsDriverState == knc::connected) {
    if (!mainUpsInfo.errorUpsData) {
      if ((mainUpsInfo.upsNet->readNumberVars (KNutNet::AllVars)) || (mainUpsInfo.upsNet->readNumberComms ())) {
        KNutPrintUpsVar *windowUpsVars = new KNutPrintUpsVar(mainUpsInfo.upsNet,settingData.useDescription);
        if (windowUpsVars->upsOk()) windowUpsVars->exec();
        delete windowUpsVars;
        }
      } else KNutVarData::showError (mainUpsInfo.netError);
    } else KNutVarData::showError (KNutNet::NotConnection);
  }


void KNutClient::slotInstComms(void) {

  if (mainUpsInfo.upsDriverState == knc::connected) {
    if (!mainUpsInfo.errorUpsData) {
      if (mainUpsInfo.upsNet->readNumberComms ()) {
        KNutInstComms *windowInstComms = new KNutInstComms(&mainUpsInfo.name,&mainUpsInfo.password,mainUpsInfo.record.userName,mainUpsInfo.record.password,mainUpsInfo.upsNet);
        if (windowInstComms->upsOk()) windowInstComms->exec();
        delete windowInstComms;
        }
      } else KNutVarData::showError (mainUpsInfo.netError);
    } else KNutVarData::showError (KNutNet::NotConnection);  
  }

void KNutClient::slotRWVars(void) {

  if (mainUpsInfo.upsDriverState == knc::connected) {
    if (!mainUpsInfo.errorUpsData) {
      if (mainUpsInfo.upsNet->readNumberVars (KNutNet::RWVars)) {
        KNutRWVar *windowRWVars = new KNutRWVar(&mainUpsInfo.name,&mainUpsInfo.password,mainUpsInfo.record.userName,mainUpsInfo.record.password,mainUpsInfo.upsNet);
        connect (windowRWVars,SIGNAL(signalChangeRWVars(QString)),this,SLOT(slotChangeRWVars(QString)));
        if (windowRWVars->upsOk())  windowRWVars->exec();
        delete windowRWVars;
       }
     }  else KNutVarData::showError (mainUpsInfo.netError);
    } else KNutVarData::showError (KNutNet::NotConnection);  
  }


void KNutClient::slotRefreshConnection(void) {

    reconnectMutex.lock();
    
    mainUpsInfo.reconnecting =false;
    reconnectTimer->stop();
    upsTimer->stop();
    upsDeactivate(); // closes connections
    
    // nastavime na docku iconu
    // sets icon for dock
    if (myDock) {
      myDock->clearDockValues();
 //     myDock->initImage();
 //     myDock->repaint();
      }
    if (mainWindow) {
      mainWindow->cleanPanels();
      }
    addEventString(i18n("Reconnect"),mainUpsInfo.record.name);
    if (myMessMan) myMessMan->deleteMessage();

//    mainUpsInfo.record.name=name;
    mainUpsInfo.errorUpsData=false;
    setActiveUpsInfo(mainUpsInfo.record.name);

  panelsAreZeroing=false;
  lastError=0; // zadna chyba
  mainUpsInfo.oldState=KNutNet::initState;

  mainUpsInfo.upsNet->newUPS(mainUpsInfo.record.upsAddress,mainUpsInfo.record.upsName, mainUpsInfo.record.port);
  // state of connection to usbd, this isn't state of knutnet
  mainUpsInfo.upsDriverState=knc::connecting;
  mainUpsInfo.upsNet->open();
  reconnectMutex.unlock();
  }
                

void KNutClient::slotChangeRWVars( QString ) {
  // informace ze doslo k uspesne zmene promene
  // vzhledem k asynchronimu zpracovani muze upsd vratit tuto hodnotu az za nejakou dobu
  // nevim zda bude potreba
  }
      
            
void KNutClient::exitMainWindow (void) {

  mainWindow=0;
  if (mainUpsInfo.upsNet) setActiveUpsVars(false);
  // Pokud neni aktivovan dock musime ukoncit aplikaci..
  // When dock isn't activated we must close application.
  if (myDock == 0l) {
    saveConfiguration(false);
    if (mainUpsInfo.upsNet) {
      delete mainUpsInfo.upsNet;
      mainUpsInfo.upsNet = 0;
      }
    kapp->quit();
    }
  }


void KNutClient::makeMainWindow (void) {

  mainWindow = new KNutMainWindow(listKNutEvent ,&mainUpsInfo, &settingData, upsRecords, analogRecords);
  connect(mainWindow, SIGNAL(UPSChanged (QString)), this, SLOT(slotSetNewUPS (QString)));
  connect(mainWindow, SIGNAL(preferenceUps()),this, SLOT(slotPreferenceUps()));
  connect(mainWindow, SIGNAL(showUPSVars()),this, SLOT(slotPrintUPSVars()));
  connect(mainWindow, SIGNAL(makeInstComms()),this, SLOT(slotInstComms()));
  connect(mainWindow, SIGNAL(makeRWVars()),this, SLOT(slotRWVars()));
  connect(mainWindow, SIGNAL(makeRefreshConnection()),this, SLOT(slotRefreshConnection()));

  connect(mainWindow, SIGNAL(endApplication()), this, SLOT(slotExitApplication()));
  connect(mainWindow, SIGNAL(destroyed()), this, SLOT(exitMainWindow()));
  }
  
void KNutClient::activeMainWindow (void) {
  if (!mainWindow) {
    //  pred activaci nastaveme promenne znovu precteme data
    // state of connection to usbd, this isn't state of knutnet
    if (mainUpsInfo.upsDriverState==knc::connected) {
      upsTimer->stop();
      setActiveUpsVars(true);
      getUpsData(); 
      makeMainWindow();
      if (myDock) myDock->repaintDock(mainUpsInfo.netError);
      upsTimer->start( 1, TRUE ); // nastartujem znovu
      // 1 proto aby se zpracovali pripadne udalosti o zruseni spojeni
      }
    else {
      setActiveUpsVars(true);
      //getUpsData();  zrusene protoze kdyz nebylo spojeni navazeno vratil by prikaz
      // getValues error=0 a doslo by vypsani data ok.
      makeMainWindow();
      if (!mainUpsInfo.errorUpsData) {
        if (myDock) myDock->repaintDock(mainUpsInfo.netError);
        }
      }  
    } // end if mainWindow
  }

void KNutClient::minimizeMainWindow (void) {
  if (mainWindow) {
    if (myDock) myDock->repaintDock(mainUpsInfo.netError);
    upsTimer->stop();
    mainWindow->close();
    mainWindow=0;
    upsTimer->start( 1, TRUE ); // starts timer // nastartujeme casovac
    }
  }


  
void KNutClient::slotExitApplication(void) {

  upsTimer->stop();
  if (mainWindow) {
    // odpojime protoze exitMainWindow by byl vykonan az po zkonceni procedury;
    disconnect(mainWindow, SIGNAL(destroyed()), this, SLOT(exitMainWindow()));
    delete mainWindow;
    mainWindow = 0;
    }
  saveConfiguration(false);
  if (mainUpsInfo.upsNet) {
    delete mainUpsInfo.upsNet;
    mainUpsInfo.upsNet = 0;
    }
  if (myDock) { myDock->close(); myDock = 0;}
  kapp->quit();
  }

#include "knutclient.moc"  



syntax highlighted by Code2HTML, v. 0.9.1