mirror of https://github.com/rusefi/openblt.git
468 lines
19 KiB
Plaintext
468 lines
19 KiB
Plaintext
unit SettingsDialog;
|
|
//***************************************************************************************
|
|
// Description: Implements the settings dialog for configuring MicroBoot.
|
|
// File Name: settingsdialog.pas
|
|
//
|
|
//---------------------------------------------------------------------------------------
|
|
// C O P Y R I G H T
|
|
//---------------------------------------------------------------------------------------
|
|
// Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
|
|
//
|
|
// This software has been carefully tested, but is not guaranteed for any particular
|
|
// purpose. The author does not offer any warranties and does not guarantee the accuracy,
|
|
// adequacy, or completeness of the software and is not responsible for any errors or
|
|
// omissions or the results obtained from use of the software.
|
|
//
|
|
//---------------------------------------------------------------------------------------
|
|
// L I C E N S E
|
|
//---------------------------------------------------------------------------------------
|
|
// This file is part of OpenBLT. OpenBLT 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 3 of the License, or (at your option) any later
|
|
// version.
|
|
//
|
|
// OpenBLT 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 have received a copy of the GNU General Public License along with OpenBLT. It
|
|
// should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
|
|
//
|
|
//***************************************************************************************
|
|
{$IFDEF FPC}
|
|
{$MODE objfpc}{$H+}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
//***************************************************************************************
|
|
// Includes
|
|
//***************************************************************************************
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
|
|
StdCtrls, ComCtrls, CurrentConfig, ConfigGroups, SessionXcpDialog,
|
|
TransportXcpRs232Dialog, TransportXcpCanDialog, TransportXcpUsbDialog,
|
|
TransportXcpTcpIpDialog, MiscellaneousDialog;
|
|
|
|
|
|
//***************************************************************************************
|
|
// Type Definitions
|
|
//***************************************************************************************
|
|
type
|
|
//------------------------------ TSettingsForm ------------------------------------------
|
|
TSettingsForm = class(TForm)
|
|
BtnCancel: TButton;
|
|
BtnOk: TButton;
|
|
CmbProtocol: TComboBox;
|
|
CmbInterface: TComboBox;
|
|
LblProtocol: TLabel;
|
|
LblInterface: TLabel;
|
|
PageCtrlSettings: TPageControl;
|
|
PnlMiscellaneousBody: TPanel;
|
|
PnlCommunicationBody: TPanel;
|
|
PnlCommunicationTop: TPanel;
|
|
PnlSessionBody: TPanel;
|
|
PnlSessionTop: TPanel;
|
|
PnlBody: TPanel;
|
|
PnlFooterButtons: TPanel;
|
|
PnlFooter: TPanel;
|
|
TabSessionProtocol: TTabSheet;
|
|
TabCommunicationInterface: TTabSheet;
|
|
TabMiscellaneous: TTabSheet;
|
|
procedure BtnCancelClick(Sender: TObject);
|
|
procedure BtnOkClick(Sender: TObject);
|
|
procedure CmbInterfaceChange(Sender: TObject);
|
|
procedure CmbProtocolChange(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormKeyPress(Sender: TObject; var Key: char);
|
|
private
|
|
FCurrentConfig: TCurrentConfig;
|
|
FSessionConfig: TSessionConfig;
|
|
FTransportConfig: TTransportConfig;
|
|
FSessionXcpForm: TSessionXcpForm;
|
|
FTransportXcpRs232Form: TTransportXcpRs232Form;
|
|
FTransportXcpCanForm: TTransportXcpCanForm;
|
|
FTransportXcpUsbForm: TTransportXcpUsbForm;
|
|
FTransportXcpTcpIpForm: TTransportXcpTcpIpForm;
|
|
FMiscellaneousForm: TMiscellaneousForm;
|
|
procedure UpdateSessionPanel;
|
|
procedure UpdateCommunicationPanel;
|
|
public
|
|
constructor Create(TheOwner: TComponent; CurrentConfig: TCurrentConfig); reintroduce;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
//---------------------------------------------------------------------------------------
|
|
//-------------------------------- TSettingsForm ----------------------------------------
|
|
//---------------------------------------------------------------------------------------
|
|
//***************************************************************************************
|
|
// NAME: FormCreate
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Form constructor.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.FormCreate(Sender: TObject);
|
|
var
|
|
sessionConfig: TSessionConfig;
|
|
transportConfig: TTransportConfig;
|
|
miscellaneousConfig: TMiscellaneousConfig;
|
|
sessionXcpConfig: TSessionXcpConfig;
|
|
transportXcpRs232Config: TTransportXcpRs232Config;
|
|
transportXcpCanConfig: TTransportXcpCanConfig;
|
|
transportXcpUsbConfig: TTransportXcpUsbConfig;
|
|
transportXcpTcpIpConfig: TTransportXcpTcpIpConfig;
|
|
begin
|
|
// Clear panel captions as these are only needed as hint during design time.
|
|
PnlBody.Caption := '';
|
|
PnlFooter.Caption := '';
|
|
PnlFooterButtons.Caption := '';
|
|
PnlSessionTop.Caption := '';
|
|
PnlSessionBody.Caption := '';
|
|
PnlCommunicationTop.Caption := '';
|
|
PnlCommunicationBody.Caption := '';
|
|
PnlMiscellaneousBody.Caption := '';
|
|
// Set the active page on the page control.
|
|
PageCtrlSettings.ActivePage := TabCommunicationInterface;
|
|
// Set fixed space between labels and the related controls.
|
|
CmbProtocol.Left := LblProtocol.Left + LblProtocol.Width + 8;
|
|
CmbInterface.Left := LblInterface.Left + LblInterface.Width + 8;
|
|
// Construct the session configuration instance and initialize its settings.
|
|
FSessionConfig := TSessionConfig.Create;
|
|
sessionConfig := FCurrentConfig.Groups[TSessionConfig.GROUP_NAME] as TSessionConfig;
|
|
FSessionConfig.Session := sessionConfig.Session;
|
|
// Construct the transport configuration instance and initialize its settings.
|
|
FTransportConfig := TTransportConfig.Create;
|
|
transportConfig := FCurrentConfig.Groups[TTransportConfig.GROUP_NAME]
|
|
as TTransportConfig;
|
|
FTransportConfig.Transport := transportConfig.Transport;
|
|
// Construct all embeddable dialogs and initialize their configuration settings.
|
|
// Miscellaneous settings embeddable dialog.
|
|
FMiscellaneousForm := TMiscellaneousForm.Create(Self);
|
|
FMiscellaneousForm.Parent := PnlMiscellaneousBody;
|
|
FMiscellaneousForm.BorderStyle := bsNone;
|
|
FMiscellaneousForm.Align := alClient;
|
|
miscellaneousConfig := FCurrentConfig.Groups[TMiscellaneousConfig.GROUP_NAME]
|
|
as TMiscellaneousConfig;
|
|
FMiscellaneousForm.LoadConfig(miscellaneousConfig);
|
|
// XCP session embeddable dialog.
|
|
FSessionXcpForm := TSessionXcpForm.Create(Self);
|
|
FSessionXcpForm.Parent := PnlSessionBody;
|
|
FSessionXcpForm.BorderStyle := bsNone;
|
|
FSessionXcpForm.Align := alClient;
|
|
sessionXcpConfig := FCurrentConfig.Groups[TSessionXcpConfig.GROUP_NAME]
|
|
as TSessionXcpConfig;
|
|
FSessionXcpForm.LoadConfig(sessionXcpConfig);
|
|
// XCP on RS232 transport layer embeddable dialog.
|
|
FTransportXcpRs232Form := TTransportXcpRs232Form.Create(Self);
|
|
FTransportXcpRs232Form.Parent := PnlCommunicationBody;
|
|
FTransportXcpRs232Form.BorderStyle := bsNone;
|
|
FTransportXcpRs232Form.Align := alClient;
|
|
transportXcpRs232Config := FCurrentConfig.Groups[TTransportXcpRs232Config.GROUP_NAME]
|
|
as TTransportXcpRs232Config;
|
|
FTransportXcpRs232Form.LoadConfig(transportXcpRs232Config);
|
|
// XCP on CAN transport layer embeddable dialog.
|
|
FTransportXcpCanForm := TTransportXcpCanForm.Create(Self);
|
|
FTransportXcpCanForm.Parent := PnlCommunicationBody;
|
|
FTransportXcpCanForm.BorderStyle := bsNone;
|
|
FTransportXcpCanForm.Align := alClient;
|
|
transportXcpCanConfig := FCurrentConfig.Groups[TTransportXcpCanConfig.GROUP_NAME]
|
|
as TTransportXcpCanConfig;
|
|
FTransportXcpCanForm.LoadConfig(transportXcpCanConfig);
|
|
// XCP on USB transport layer embeddable dialog.
|
|
FTransportXcpUsbForm := TTransportXcpUsbForm.Create(Self);
|
|
FTransportXcpUsbForm.Parent := PnlCommunicationBody;
|
|
FTransportXcpUsbForm.BorderStyle := bsNone;
|
|
FTransportXcpUsbForm.Align := alClient;
|
|
transportXcpUsbConfig := FCurrentConfig.Groups[TTransportXcpUsbConfig.GROUP_NAME]
|
|
as TTransportXcpUsbConfig;
|
|
FTransportXcpUsbForm.LoadConfig(transportXcpUsbConfig);
|
|
// XCP on TCP/IP transport layer embeddable dialog.
|
|
FTransportXcpTcpIpForm := TTransportXcpTcpIpForm.Create(Self);
|
|
FTransportXcpTcpIpForm.Parent := PnlCommunicationBody;
|
|
FTransportXcpTcpIpForm.BorderStyle := bsNone;
|
|
FTransportXcpTcpIpForm.Align := alClient;
|
|
transportXcpTcpIpConfig := FCurrentConfig.Groups[TTransportXcpTcpIpConfig.GROUP_NAME]
|
|
as TTransportXcpTcpIpConfig;
|
|
FTransportXcpTcpIpForm.LoadConfig(transportXcpTcpIpConfig);
|
|
// Embed the miscellaneous setting dialog.
|
|
FMiscellaneousForm.Show;
|
|
// Embed the correct session dialog based on the currently configured session.
|
|
UpdateSessionPanel;
|
|
// Embed the correct transport dialog based on the currently configured transport
|
|
// layer.
|
|
UpdateCommunicationPanel;
|
|
end; //*** end of FormCreate ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: FormDestroy
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Form destructor.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.FormDestroy(Sender: TObject);
|
|
begin
|
|
// Release the configuration instances.
|
|
FTransportConfig.Free;
|
|
FSessionConfig.Free;
|
|
end; //*** end of FormDestroy ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: FormKeyPress
|
|
// PARAMETER: Sender Signal source.
|
|
// Key The key's character code that was pressed
|
|
// RETURN VALUE: None.
|
|
// DESCRIPTION: Called when a key is pressed.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.FormKeyPress(Sender: TObject; var Key: char);
|
|
begin
|
|
// Was the escape key pressed?
|
|
if Key = Char(27) then
|
|
begin
|
|
// Simulate button cancel click.
|
|
BtnCancelClick(Sender)
|
|
end
|
|
// Was the enter key pressed?
|
|
else if Key = Char(13) then
|
|
begin
|
|
if ActiveControl.Name = 'BtnCancel' then
|
|
// Simulate button cancel click.
|
|
BtnCancelClick(Sender)
|
|
else
|
|
// Simulate button ok click.
|
|
BtnOKClick(Sender);
|
|
end;
|
|
end; //*** end of FormKeyPress ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: BtnOkClick
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Event handler that gets called when the button is clicked.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.BtnOkClick(Sender: TObject);
|
|
var
|
|
sessionConfig: TSessionConfig;
|
|
sessionXcpConfig: TSessionXcpConfig;
|
|
miscellaneousConfig: TMiscellaneousConfig;
|
|
transportConfig: TTransportConfig;
|
|
transportXcpRs232Config: TTransportXcpRs232Config;
|
|
transportXcpCanConfig: TTransportXcpCanConfig;
|
|
transportXcpUsbConfig: TTransportXcpUsbConfig;
|
|
transportXcpTcpIpConfig: TTransportXcpTcpIpConfig;
|
|
begin
|
|
// Update the session settings in current config.
|
|
sessionConfig := FCurrentConfig.Groups[TSessionConfig.GROUP_NAME] as TSessionConfig;
|
|
sessionConfig.Session := FSessionConfig.Session;
|
|
// Update the XCP session settings in current config.
|
|
sessionXcpConfig := FCurrentConfig.Groups[TSessionXcpConfig.GROUP_NAME]
|
|
as TSessionXcpConfig;
|
|
FSessionXcpForm.SaveConfig(sessionXcpConfig);
|
|
// Update the transport layer settings in current config.
|
|
transportConfig := FCurrentConfig.Groups[TTransportConfig.GROUP_NAME]
|
|
as TTransportConfig;
|
|
transportConfig.Transport := FTransportConfig.Transport;
|
|
// Update the miscellanouse settings in the current config.
|
|
miscellaneousConfig := FCurrentConfig.Groups[TMiscellaneousConfig.GROUP_NAME]
|
|
as TMiscellaneousConfig;
|
|
FMiscellaneousForm.SaveConfig(miscellaneousConfig);
|
|
// Update the XCP on RS232 transport layer settings in current config.
|
|
transportXcpRs232Config := FCurrentConfig.Groups[TTransportXcpRs232Config.GROUP_NAME]
|
|
as TTransportXcpRs232Config;
|
|
FTransportXcpRs232Form.SaveConfig(transportXcpRs232Config);
|
|
// Update the XCP on CAN transport layer settings in current config.
|
|
transportXcpCanConfig := FCurrentConfig.Groups[TTransportXcpCanConfig.GROUP_NAME]
|
|
as TTransportXcpCanConfig;
|
|
FTransportXcpCanForm.SaveConfig(transportXcpCanConfig);
|
|
// Update the XCP on USB transport layer settings in current config.
|
|
transportXcpUsbConfig := FCurrentConfig.Groups[TTransportXcpUsbConfig.GROUP_NAME]
|
|
as TTransportXcpUsbConfig;
|
|
FTransportXcpUsbForm.SaveConfig(transportXcpUsbConfig);
|
|
// Update the XCP on TCP/IP transport layer settings in current config.
|
|
transportXcpTcpIpConfig := FCurrentConfig.Groups[TTransportXcpTcpIpConfig.GROUP_NAME]
|
|
as TTransportXcpTcpIpConfig;
|
|
FTransportXcpTcpIpForm.SaveConfig(transportXcpTcpIpConfig);
|
|
// Set the modal result value, which also closes the dialog.
|
|
ModalResult := mrOK;
|
|
end; //*** end of BtnOkClick ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: BtnCancelClick
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Event handler that gets called when the button is clicked.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.BtnCancelClick(Sender: TObject);
|
|
begin
|
|
// Set the modal result value, which also closes the dialog.
|
|
ModalResult := mrCancel;
|
|
end; //*** end of BtnCancelClick ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: CmbProtocolChange
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Event handler that gets called when the selected entry in the combobox
|
|
// changed.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.CmbProtocolChange(Sender: TObject);
|
|
begin
|
|
// Configure the correct protocol session based on the selected combobox entry.
|
|
if CmbProtocol.Text = 'XCP version 1.0' then
|
|
begin
|
|
FSessionConfig.Session := 'xcp';
|
|
end
|
|
// Unknown protocol session
|
|
else
|
|
begin
|
|
Assert(False, 'Unknown session protocol encountered in the combobox.');
|
|
end;
|
|
// Embed the correct session dialog based on the currently configured session.
|
|
UpdateSessionPanel;
|
|
end; //*** end of CmbProtocolChange ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: CmbInterfaceChange
|
|
// PARAMETER: Sender Source of the event.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Event handler that gets called when the selected entry in the combobox
|
|
// changed.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.CmbInterfaceChange(Sender: TObject);
|
|
begin
|
|
// Configure the correct communication interface based on the selected combobox entry.
|
|
if CmbInterface.Text = 'XCP on RS232' then
|
|
begin
|
|
FTransportConfig.Transport := 'xcp_rs232';
|
|
end
|
|
else if CmbInterface.Text = 'XCP on CAN' then
|
|
begin
|
|
FTransportConfig.Transport := 'xcp_can';
|
|
end
|
|
else if CmbInterface.Text = 'XCP on USB' then
|
|
begin
|
|
FTransportConfig.Transport := 'xcp_usb';
|
|
end
|
|
else if CmbInterface.Text = 'XCP on TCP/IP' then
|
|
begin
|
|
FTransportConfig.Transport := 'xcp_net';
|
|
end
|
|
// Unknown protocol session
|
|
else
|
|
begin
|
|
Assert(False, 'Unknown communication interface encountered in the combobox.');
|
|
end;
|
|
// Embed the correct transport layer dialog based on the currently configured transport
|
|
// layer
|
|
UpdateCommunicationPanel;
|
|
end; //*** end of CmbInterfaceChange ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: UpdateSessionPanel
|
|
// PARAMETER: none
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Embeds the correct protocol session configuration dialog.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.UpdateSessionPanel;
|
|
begin
|
|
// First hide all protocol session related forms.
|
|
FSessionXcpForm.Hide;
|
|
// Show the correct protocol session form.
|
|
if FSessionConfig.Session = 'xcp' then
|
|
begin
|
|
CmbProtocol.ItemIndex := 0;
|
|
FSessionXcpForm.Show;
|
|
end
|
|
// Default configuration
|
|
else
|
|
begin
|
|
CmbProtocol.ItemIndex := 0;
|
|
FSessionXcpForm.Show;
|
|
end;
|
|
end; //*** end of UpdateSessionPanel ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: UpdateCommunicationPanel
|
|
// PARAMETER: none
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Embeds the correct communication interface configuration dialog.
|
|
//
|
|
//***************************************************************************************
|
|
procedure TSettingsForm.UpdateCommunicationPanel;
|
|
begin
|
|
// First hide all communication interface related forms.
|
|
FTransportXcpRs232Form.Hide;
|
|
FTransportXcpCanForm.Hide;
|
|
FTransportXcpUsbForm.Hide;
|
|
FTransportXcpTcpIpForm.Hide;
|
|
// Show the correct communication interface form.
|
|
if FTransportConfig.Transport = 'xcp_rs232' then
|
|
begin
|
|
CmbInterface.ItemIndex := 0;
|
|
FTransportXcpRs232Form.Show;
|
|
end
|
|
else if FTransportConfig.Transport = 'xcp_can' then
|
|
begin
|
|
CmbInterface.ItemIndex := 1;
|
|
FTransportXcpCanForm.Show;
|
|
end
|
|
else if FTransportConfig.Transport = 'xcp_usb' then
|
|
begin
|
|
CmbInterface.ItemIndex := 2;
|
|
FTransportXcpUsbForm.Show;
|
|
end
|
|
else if FTransportConfig.Transport = 'xcp_net' then
|
|
begin
|
|
CmbInterface.ItemIndex := 3;
|
|
FTransportXcpTcpIpForm.Show;
|
|
end
|
|
// Default configuration
|
|
else
|
|
begin
|
|
CmbInterface.ItemIndex := 0;
|
|
FTransportXcpRs232Form.Show;
|
|
end;
|
|
end; //*** end of UpdateCommunicationPanel ***
|
|
|
|
|
|
//***************************************************************************************
|
|
// NAME: Create
|
|
// PARAMETER: TheOwner Owner of the settings form instance.
|
|
// CurrentConfig Current configuration instance.
|
|
// RETURN VALUE: none
|
|
// DESCRIPTION: Class constructor.
|
|
//
|
|
//***************************************************************************************
|
|
constructor TSettingsForm.Create(TheOwner: TComponent; CurrentConfig: TCurrentConfig);
|
|
begin
|
|
// Call the inherited constructor.
|
|
inherited Create(TheOwner);
|
|
// Check parameters.
|
|
Assert(CurrentConfig <> nil, 'Current configuration instance cannot be null');
|
|
// Store the configuration instance.
|
|
FCurrentConfig := CurrentConfig;
|
|
end; //*** end of Create ***
|
|
|
|
end.
|
|
//******************************** end of settingsdialog.pas ****************************
|
|
|