File "Advanced.cpp"
Full Path: /home/analogde/www/PIC18F452/Advanced.cpp
File size: 11.22 KB
MIME-type: text/x-c
Charset: utf-8
/**********************************************************************/
/* */
/* File name: Advanced.cpp */
/* */
/* Since: 2002/12/03 */
/* */
/* Version: 1.02 */
/* */
/* Author: MONTAGNE Xavier [XM] {link xavier.montagne@wanadoo.fr} */
/* */
/* Purpose: Manage the Advanced Window to program easily the */
/* the configuration of the LPT port. */
/* */
/* 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] Added Delay_Porg management & auto-setup. */
/* */
/**********************************************************************/
/***********************************************************************
* INCLUDES
**********************************************************************/
#include <vcl.h>
#include <vcl\Registry.hpp>
#include "Advanced.h"
#include "Settings.h"
#include "DLL_interface.h"
#pragma hdrstop
/***********************************************************************
* Global variables.
**********************************************************************/
unsigned char HexToIndex(unsigned char mask);
unsigned char IndexToHex(int Index);
static unsigned int delay_IO_tmp;
static unsigned int delay_Prog_tmp;
extern unsigned int delay_IO;
extern unsigned int delay_Prog;
extern TRegistry *regKey;
extern unsigned short LPT_adr_out;
extern unsigned short LPT_adr_in;
#pragma package(smart_init)
#pragma resource "*.dfm"
TAdvancedWindow *AdvancedWindow;
extern TSettingsWindow *SettingsWindow;
/***********************************************************************
* Window constructor.
*
* @param TComponent* Owner IN Parent object reference
* @return none
**********************************************************************/
__fastcall TAdvancedWindow::TAdvancedWindow(TComponent* Owner)
: TForm(Owner)
{
}
/***********************************************************************
* Quit the window and save the settings into register base (sould be).
* Also modify the DLL structures to take into account the new
* parameters.
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::ButtonOKClick(TObject *Sender)
{
unsigned char mask;
unsigned char status;
char string[10], i;
strcpy(string, AdrOutBox->Text.c_str());
if ((string[0] != '0') || (string[1] != 'x'))
{
Application->MessageBox("Wrong LPT base address !", "LPT parameter", MB_ICONERROR + MB_OK);
return;
}
for (i = 2; i < 6; i++)
if ( (string[i] < '0') ||
((string[i] > '9') && (string[i] < 'A') ) ||
((string[i] > 'F') && (string[i] < 'a') ) ||
(string[i] > 'f') )
{
Application->MessageBox("Wrong LPT base address !", "LPT parameter", MB_ICONERROR + MB_OK);
return;
}
if ((IndexToHex(ComboBox_CLOCK->ItemIndex) == IndexToHex(ComboBox_DataToPIC->ItemIndex)) ||
(IndexToHex(ComboBox_CLOCK->ItemIndex) == IndexToHex(ComboBox_VPP->ItemIndex)) ||
(IndexToHex(ComboBox_CLOCK->ItemIndex) == IndexToHex(ComboBox_VCC->ItemIndex)) ||
(IndexToHex(ComboBox_DataToPIC->ItemIndex) == IndexToHex(ComboBox_VPP->ItemIndex)) ||
(IndexToHex(ComboBox_DataToPIC->ItemIndex) == IndexToHex(ComboBox_VCC->ItemIndex)) ||
(IndexToHex(ComboBox_VPP->ItemIndex) == IndexToHex(ComboBox_VCC->ItemIndex)) )
{
Application->MessageBox("Warning ! You assign LPT bits to multiple signals.", "LPT parameter error", MB_ICONERROR | MB_OK);
return;
}
regKey->OpenKey("\\Software\\PP18\\DLL\\Settings", false);
ReadSettings(PL_CLOCK, &mask, &status);
mask = IndexToHex(ComboBox_CLOCK->ItemIndex);
Settings(PL_CLOCK, mask, status);
regKey->WriteInteger("CLOCK_MASK", mask);
ReadSettings(PL_DATA_TO_PIC, &mask, &status);
mask = IndexToHex(ComboBox_DataToPIC->ItemIndex);
Settings(PL_DATA_TO_PIC, mask, status);
regKey->WriteInteger("DATA_TO_PIC_MASK", mask);
ReadSettings(PL_VPP, &mask, &status);
mask = IndexToHex(ComboBox_VPP->ItemIndex);
Settings(PL_VPP, mask, status);
regKey->WriteInteger("VPP_MASK", mask);
ReadSettings(PL_VCC, &mask, &status);
mask = IndexToHex(ComboBox_VCC->ItemIndex);
Settings(PL_VCC, mask, status);
regKey->WriteInteger("VCC_MASK", mask);
ReadSettings(PL_DATA_FROM_PIC, &mask, &status);
mask = IndexToHex(ComboBox_DataFromPIC->ItemIndex);
Settings(PL_DATA_FROM_PIC, mask, status);
regKey->WriteInteger("DATA_FROM_PIC_MASK", mask);
delay_IO = delay_IO_tmp;
delay_Prog = delay_Prog_tmp;
regKey->WriteInteger("DelayIO", delay_IO);
regKey->WriteInteger("DelayProg", delay_Prog);
LPT_adr_out = StrToInt(AdrOutBox->Text);
LPT_adr_in = LPT_adr_out + 1;
regKey->WriteInteger("LPT_port_@", LPT_adr_out);
SettingsWindow->Enabled = true;
AdvancedWindow->Close();
}
/***********************************************************************
* Quit the window and without saving.
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::ButtonCancelClick(TObject *Sender)
{
SettingsWindow->Enabled = true;
AdvancedWindow->Close();
}
/***********************************************************************
* Display and initialize the window with the LPT port settings.
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::FormShow(TObject *Sender)
{
unsigned char mask;
unsigned char status;
TrackBar_IO->Position = delay_IO;
TrackBar_Prog->Position = delay_Prog;
delay_IO_tmp = delay_IO;
delay_Prog_tmp = delay_Prog;
ReadSettings(PL_CLOCK, &mask, &status);
ComboBox_CLOCK->ItemIndex = HexToIndex(mask);
ReadSettings(PL_DATA_TO_PIC, &mask, &status);
ComboBox_DataToPIC->ItemIndex = HexToIndex(mask);
ReadSettings(PL_VPP, &mask, &status);
ComboBox_VPP->ItemIndex = HexToIndex(mask);
ReadSettings(PL_VCC, &mask, &status);
ComboBox_VCC->ItemIndex = HexToIndex(mask);
ReadSettings(PL_DATA_FROM_PIC, &mask, &status);
ComboBox_DataFromPIC->ItemIndex = HexToIndex(mask);
AdrOutBox->Text = "0x" + IntToHex(LPT_adr_out, 4);
}
/***********************************************************************
* Find the bit number set at 1 in a byte.
*
* @param u_char mask IN Signal mask in LPT port
* @return u_char Bit number of the signal
**********************************************************************/
unsigned char HexToIndex(unsigned char mask)
{
switch (mask)
{
case 0x01 : return(0);
case 0x02 : return(1);
case 0x04 : return(2);
case 0x08 : return(3);
case 0x10 : return(4);
case 0x20 : return(5);
case 0x40 : return(6);
case 0x80 : return(7);
}
return (0);
}
/***********************************************************************
* Convert a bit number into a byte value.
*
* @param int Index IN Bit number
* @return char Byte converted
**********************************************************************/
unsigned char IndexToHex(int Index)
{
switch (Index)
{
case 0 : return(0x01);
case 1 : return(0x02);
case 2 : return(0x04);
case 3 : return(0x08);
case 4 : return(0x10);
case 5 : return(0x20);
case 6 : return(0x40);
case 7 : return(0x80);
}
return (0);
}
/***********************************************************************
* Change the Delay_IO of the read / write functions in "driver.c".
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::TrackBar_IOChange(TObject *Sender)
{
delay_IO_tmp = TrackBar_IO->Position;
}
/***********************************************************************
* Change the Delay_Prog of the read / write functions in "driver.c".
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::TrackBar_ProgChange(TObject *Sender)
{
delay_Prog_tmp = TrackBar_Prog->Position;
}
/***********************************************************************
* Try to find the smallest value for Delay_IO and Delay_Prog.
*
* @param TObject *Sender IN Caller object reference
* @return none
**********************************************************************/
void __fastcall TAdvancedWindow::AutoButtonClick(TObject *Sender)
{
char temp[10];
delay_Prog = 0;
InitHardware();
PowerOn();
while ( (ReadRevDev (&temp[0]) != PIC_DETECTED) )
{
delay_Prog++;
TrackBar_Prog->Position = delay_Prog;
if (delay_Prog == TrackBar_Prog->Max)
{
Application->MessageBox("No PIC detected.", "Auto setup report :",
MB_ICONERROR | MB_OK);
delay_Prog = delay_Prog_tmp;
PowerOff();
InitHardware();
return;
}
}
Application->MessageBox("Device detected !", "Auto setup report :",
MB_ICONEXCLAMATION | MB_OK);
delay_Prog_tmp = delay_Prog;
PowerOff();
InitHardware();
return;
}
/* End of file */