File "Settings.cpp"

Full Path: /home/analogde/www/PIC18F452/Settings.cpp
File size: 15.62 KB
MIME-type: text/x-c
Charset: utf-8

/**********************************************************************/
/*                                                                    */
/* File name: Settings.cpp                                            */
/*                                                                    */
/* Since:     2002/12/03                                              */
/*                                                                    */
/* Version:   1.02                                                    */
/*                                                                    */
/* Author:    MONTAGNE Xavier [XM] {link xavier.montagne@wanadoo.fr}  */
/*                                                                    */
/* Purpose: Manage the Settings Window to program easily the          */
/*          the configuration of the programmer.                      */
/*                                                                    */
/* Distribution: This file is part of PP18.                           */
/*               PP18 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, or (at your option)    */
/*               any later version.                                   */
/*                                                                    */
/*               PP18 is distributed in the hope that it will be      */
/*               useful, but WITHOUT ANY WARRANTY; without even the   */
/*               implied warranty of MERCHANTABILITY or FITNESS FOR A */
/*               PARTICULAR PURPOSE.  See the GNU General Public      */
/*               License for more details.                            */
/*                                                                    */
/*               You should have received a copy of the GNU General   */
/*               Public License along with PP18; see the file         */
/*               COPYING.txt. If not, write to the Free Software      */
/*               Foundation, 59 Temple Place - Suite 330,             */
/*               Boston, MA 02111-1307, USA.                          */
/*                                                                    */
/* History:                                                           */
/*      2002/12/03  [XM] Create this file                             */
/*      2003/06/26  [XM] AdvancedWindow is no more called as modal.   */
/*                                                                    */
/**********************************************************************/

/***********************************************************************
 * INCLUDES
 **********************************************************************/
#include <vcl.h>
#include <vcl\Registry.hpp>

#include "Com.h"
#include "Advanced.h"
#include "Settings.h"
#pragma hdrstop

/***********************************************************************
 * Function prototypes.
 **********************************************************************/
void AnalyseDataFromPIC(void);
extern "C" void SettingsWindow_Show(void);

/***********************************************************************
 * Global variables.
 **********************************************************************/
extern TAdvancedWindow *AdvancedWindow;
extern TRegistry *regKey;

static unsigned char CLOCK_status;
static unsigned char DataToPIC_status;
static unsigned char DataFromPIC_status;
static unsigned char VPP_status;
static unsigned char VCC_status;

#pragma package(smart_init)
#pragma resource "*.dfm"
TSettingsWindow *SettingsWindow;

/***********************************************************************
 * Window constructor.
 *
 * @param  TComponent* Owner  IN  Parent object reference
 * @return none
 **********************************************************************/
__fastcall TSettingsWindow::TSettingsWindow(TComponent* Owner)
    : TForm(Owner)
{

}

/***********************************************************************
 * Quit the window and save the settings into register base (sould be).
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::ButtonOKClick(TObject *Sender)
{
  unsigned char ucMask, ucStatus;

  regKey->OpenKey("\\Software\\PP18\\DLL\\Settings", false);

  ReadSettings(PL_CLOCK, &ucMask, &ucStatus);
  regKey->WriteInteger("CLOCK_INV", ucStatus);
  ReadSettings(PL_VCC, &ucMask, &ucStatus);
  regKey->WriteInteger("VCC_INV", ucStatus);
  ReadSettings(PL_VPP, &ucMask, &ucStatus);
  regKey->WriteInteger("VPP_INV", ucStatus);
  ReadSettings(PL_DATA_FROM_PIC, &ucMask, &ucStatus);
  regKey->WriteInteger("DATA_FROM_PIC_INV", ucStatus);
  ReadSettings(PL_DATA_TO_PIC, &ucMask, &ucStatus);
  regKey->WriteInteger("DATA_TO_PIC_INV", ucStatus);

  SettingsWindow->Close();
}

/***********************************************************************
 * Quit the window and restore the previous settings.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::ButtonCancelClick(TObject *Sender)
{
  if (CLOCK_status == INVERTED)
    RB_CLOCK_InvClick(Sender);
  else
    RB_CLOCK_NInvClick(Sender);
  if (DataToPIC_status == INVERTED)
    RB_DataToPIC_InvClick(Sender);
  else
    RB_DataToPIC_NInvClick(Sender);
  if (DataFromPIC_status == INVERTED)
    RB_DataFromPIC_InvClick(Sender);
  else
    RB_DataFromPIC_NInvClick(Sender);
  if (VPP_status == INVERTED)
    RB_VPP_InvClick(Sender);
  else
    RB_VPP_NInvClick(Sender);
  if (VCC_status == INVERTED)
    RB_VCC_InvClick(Sender);
  else
    RB_VCC_NInvClick(Sender);
  Settings(PL_CLOCK, 0, CLOCK_status);
  Settings(PL_DATA_TO_PIC, 0, DataToPIC_status);
  Settings(PL_DATA_FROM_PIC, 0, DataFromPIC_status);
  Settings(PL_VPP, 0, VPP_status);
  Settings(PL_VCC, 0, VCC_status);

  SettingsWindow->Close();
}

/***********************************************************************
 * Set the CLOCK signal at logical 1 or 0.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::SB_CLOCKClick(TObject *Sender)
{
  if (SB_CLOCK->Down == true)
  {
    TestIO_ON(PL_CLOCK);
    SB_CLOCK->Caption = "ON ";
    AnalyseDataFromPIC();
    TestIO_ON(PL_CLOCK);
  }
  else
  {
    TestIO_OFF(PL_CLOCK);
    SB_CLOCK->Caption = "OFF";
    AnalyseDataFromPIC();
    TestIO_OFF(PL_CLOCK);
  }
}

/***********************************************************************
 * Set the DataToPIC signal at logical 1 or 0.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::SB_DataToPICClick(TObject *Sender)
{
  if (SB_DataToPIC->Down == true)
  {
    TestIO_ON(PL_DATA_TO_PIC);
    SB_DataToPIC->Caption = "ON ";
  }
  else
  {
    TestIO_OFF(PL_DATA_TO_PIC);
    SB_DataToPIC->Caption = "OFF";
  }
  AnalyseDataFromPIC();
}

/***********************************************************************
 * Set the VPP signal at logical 1 or 0.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::SB_VPPClick(TObject *Sender)
{
  if (SB_VPP->Down == true)
  {
    TestIO_ON(PL_VPP);
    SB_VPP->Caption = "ON ";
  }
  else
  {
    TestIO_OFF(PL_VPP);
    SB_VPP->Caption = "OFF";
  }
  AnalyseDataFromPIC();
}

/***********************************************************************
 * Set the VCC signal at logical 1 or 0.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::SB_VCCClick(TObject *Sender)
{
  if (SB_VCC->Down == true)
  {
    TestIO_ON(PL_VCC);
    SB_VCC->Caption = "ON ";
  }
  else
  {
    TestIO_OFF(PL_VCC);
    SB_VCC->Caption = "OFF";
  }
  AnalyseDataFromPIC();
}

/***********************************************************************
 * Invert the CLOCK signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_CLOCK_InvClick(TObject *Sender)
{
  RB_CLOCK_Inv->Checked = true;
  RB_CLOCK_NInv->Checked = false;
  Settings(PL_CLOCK, 0, INVERTED);
  SB_CLOCKClick(Sender);
}

/***********************************************************************
 * Display the window and store the settings into local variables.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::FormShow(TObject *Sender)
{
  unsigned char ucMask, ucStatus;

  TestIO_OFF(PL_CLOCK);
  TestIO_OFF(PL_DATA_TO_PIC);
  TestIO_OFF(PL_VPP);
  TestIO_OFF(PL_VCC);

  ReadSettings(PL_CLOCK, &ucMask, &ucStatus);
  if (ucStatus == INVERTED)
  {
    RB_CLOCK_InvClick(Sender);
    CLOCK_status = INVERTED;
  }
  else
  {
    RB_CLOCK_NInvClick(Sender);
    CLOCK_status = NON_INVERTED;
  }

  ReadSettings(PL_DATA_TO_PIC, &ucMask, &ucStatus);
  if (ucStatus == INVERTED)
  {
    RB_DataToPIC_InvClick(Sender);
    DataToPIC_status = INVERTED;
  }
  else
  {
    RB_DataToPIC_NInvClick(Sender);
    DataToPIC_status = NON_INVERTED;
  }

  ReadSettings(PL_VPP, &ucMask, &ucStatus);
  if (ucStatus == INVERTED)
  {
    RB_VPP_InvClick(Sender);
    VPP_status = INVERTED;
  }
  else
  {
    RB_VPP_NInvClick(Sender);
    VPP_status = NON_INVERTED;
  }

  ReadSettings(PL_VCC, &ucMask, &ucStatus);
  if (ucStatus == INVERTED)
  {
    RB_VCC_InvClick(Sender);
    VCC_status = INVERTED;
  }
  else
  {
    RB_VCC_NInvClick(Sender);
    VCC_status = NON_INVERTED;
  }

  ReadSettings(PL_DATA_FROM_PIC, &ucMask, &ucStatus);
  if (ucStatus == INVERTED)
  {
    RB_DataFromPIC_InvClick(Sender);
    DataFromPIC_status = INVERTED;
  }
  else
  {
    RB_DataFromPIC_NInvClick(Sender);
    DataFromPIC_status = NON_INVERTED;
  }

  AnalyseDataFromPIC();
}

/***********************************************************************
 * Non invert the VPP signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_VPP_NInvClick(TObject *Sender)
{
  RB_VPP_NInv->Checked = true;
  RB_VPP_Inv->Checked = false;
  Settings(PL_VPP, 0, NON_INVERTED);
  SB_VPPClick(Sender);
}

/***********************************************************************
 * Non invert the CLOCK signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_CLOCK_NInvClick(TObject *Sender)
{
  RB_CLOCK_NInv->Checked = true;
  RB_CLOCK_Inv->Checked = false;
  Settings(PL_CLOCK, 0, NON_INVERTED);
  SB_CLOCKClick(Sender);
}

/***********************************************************************
 * Invert the DataToPIC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_DataToPIC_InvClick(TObject *Sender)
{
  RB_DataToPIC_Inv->Checked = true;
  RB_DataToPIC_NInv->Checked = false;
  Settings(PL_DATA_TO_PIC, 0, INVERTED);
  SB_DataToPICClick(Sender);
}

/***********************************************************************
 * Non invert the DataToPIC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_DataToPIC_NInvClick(TObject *Sender)
{
  RB_DataToPIC_NInv->Checked = true;
  RB_DataToPIC_Inv->Checked = false;
  Settings(PL_DATA_TO_PIC, 0, NON_INVERTED);
  SB_DataToPICClick(Sender);
}

/***********************************************************************
 * Invert the DataFromPIC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_DataFromPIC_InvClick(TObject *Sender)
{
  RB_DataFromPIC_Inv->Checked = true;
  RB_DataFromPIC_NInv->Checked = false;
  Settings(PL_DATA_FROM_PIC, 0, INVERTED);
  AnalyseDataFromPIC();
}

/***********************************************************************
 * Non invert the DataFromPIC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_DataFromPIC_NInvClick(TObject *Sender)
{
  RB_DataFromPIC_NInv->Checked = true;
  RB_DataFromPIC_Inv->Checked = false;
  Settings(PL_DATA_FROM_PIC, 0, NON_INVERTED);
  AnalyseDataFromPIC();  
}

/***********************************************************************
 * Invert the VPP signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_VPP_InvClick(TObject *Sender)
{
  RB_VPP_Inv->Checked = true;
  RB_VPP_NInv->Checked = false;
  Settings(PL_VPP, 0, INVERTED);
  SB_VPPClick(Sender);
}

/***********************************************************************
 * Invert the VCC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_VCC_InvClick(TObject *Sender)
{
  RB_VCC_Inv->Checked = true;
  RB_VCC_NInv->Checked = false;
  Settings(PL_VCC, 0, INVERTED);
  SB_VCCClick(Sender);
}

/***********************************************************************
 * Non invert the VCC signal.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::RB_VCC_NInvClick(TObject *Sender)
{
  RB_VCC_NInv->Checked = true;
  RB_VCC_Inv->Checked = false;
  Settings(PL_VCC, 0, NON_INVERTED);
  SB_VCCClick(Sender);
}

/***********************************************************************
 * Read the DataFromPIC signal.
 *
 * @param  void
 * @return none
 **********************************************************************/
void AnalyseDataFromPIC(void)
{
  unsigned char ucReadValue;

  ReadDataFromPic(&ucReadValue);
  if (ucReadValue)
    SettingsWindow->Im_DataFromPIC_ON->Visible = true;
  else
    SettingsWindow->Im_DataFromPIC_ON->Visible = false;
}

/***********************************************************************
 * Display the advanced settings window.
 *
 * @param  TObject *Sender    IN  Caller object reference
 * @return none
 **********************************************************************/
void __fastcall TSettingsWindow::ButtonAdvClick(TObject *Sender)
{
  if (AdvancedWindow == NULL)
    AdvancedWindow = new TAdvancedWindow(Application);
  SettingsWindow->Enabled = false;
  AdvancedWindow->Show();
}

/***********************************************************************
 * Build one instance of the TASettingsWindow object.
 * Show the window into modal mode (the window captures the focus).
 *
 * @param  void
 * @return void
 **********************************************************************/
void SettingsWindow_Show(void)
{
  if (SettingsWindow == NULL)
    SettingsWindow = new TSettingsWindow(Application);
  SettingsWindow->ShowModal();
}