/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 1992-2020 Kicad Developers, see AUTHORS.txt for contributors.
*
* 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 3
* of the License, or (at your option) any later version.
*
* This program 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 this program. If not, see .
*/
/**
* @file pcb_calculator.h
*/
#ifndef PCB_CALCULATOR_H
#define PCB_CALCULATOR_H
#include
#include
#include
#include // Included for SUBST_PRMS_ID definition.
#include
extern const wxString PcbCalcDataFileExt;
class PCB_CALCULATOR_SETTINGS;
/* Class PCB_CALCULATOR_FRAME_BASE
This is the main frame for this application
*/
class PCB_CALCULATOR_FRAME : public PCB_CALCULATOR_FRAME_BASE
{
public:
REGULATOR_LIST m_RegulatorList; // the list of known regulator
private:
bool m_RegulatorListChanged; // set to true when m_RegulatorList
// was modified, and the corresponging file
// must be rewritten
enum // Which dimension is controlling the track
{ // width / current calculations:
TW_MASTER_CURRENT, // the maximum current,
TW_MASTER_EXT_WIDTH, // the external trace width,
TW_MASTER_INT_WIDTH // or the internal trace width?
} m_TWMode;
bool m_TWNested; // Used to stop events caused by setting the answers.
enum TRANSLINE_TYPE_ID m_currTransLineType;
TRANSLINE* m_currTransLine; // a pointer to the active transline
// List of translines: ordered like in dialog menu list
std::vector m_transline_list;
ATTENUATOR* m_currAttenuator;
// List ofattenuators: ordered like in dialog menu list
std::vector m_attenuator_list;
wxString m_lastSelectedRegulatorName; // last regulator name selected
public:
PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent );
~PCB_CALCULATOR_FRAME();
private:
// Event handlers
void OnClosePcbCalc( wxCloseEvent& event ) override;
// These 3 functions are called by the OnPaint event, to draw
// icons that show the current item on the specific panels
void OnPaintTranslinePanel( wxPaintEvent& event ) override;
void OnPaintAttenuatorPanel( wxPaintEvent& event ) override;
// Config read-write, virtual from EDA_BASE_FRAME
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
// R/W data files:
bool ReadDataFile();
bool WriteDataFile();
/**
* @return the full filename of the selected pcb_calculator data file
*/
const wxString GetDataFilename();
/**
* Initialize the full filename of the selected pcb_calculator data file
* force the standard extension of the file (.pcbcalc)
* @param aFilename = the full filename, with or without extension
*/
void SetDataFilename( const wxString& aFilename );
// Trace width / maximum current capability calculations.
/**
* Function TW_Init
* Read config and init dialog widgets values
*/
void TW_Init();
/**
* E-Series Resistor calculator Panel
* Called on calculator start to display markdown formula explanations
*/
void ES_Init( void );
/**
* Called on calculate button and executes all E-series calculations
*
*/
void OnCalculateESeries( wxCommandEvent& event ) override;
/**
* Radio Buttons to select the E-serie for the resistor calculator
* @param event contains the radio button state
*/
void OnESerieSelection( wxCommandEvent& event ) override;
/**
* Function TW_WriteConfig
* Write Track width parameters in config
*/
void TW_WriteConfig();
/**
* Function OnTWParametersChanged
* Called when the user changes the general parameters (i.e., anything that
* is not one of the controlling values). This update the calculations.
*/
void OnTWParametersChanged( wxCommandEvent& event ) override;
/**
* Function OnTWCalculateFromCurrent
* Called when the user changes the desired maximum current. This sets the
* current as the controlling value and performs the calculations.
*/
void OnTWCalculateFromCurrent( wxCommandEvent& event ) override;
/**
* Function OnTWCalculateFromExtWidth
* Called when the user changes the desired external trace width. This sets
* the external width as the controlling value and performs the calculations.
*/
void OnTWCalculateFromExtWidth( wxCommandEvent& event ) override;
/**
* Function OnTWCalculateFromIntWidth
* Called when the user changes the desired internal trace width. This sets
* the internal width as the controlling value and performs the calculations.
*/
void OnTWCalculateFromIntWidth( wxCommandEvent& event ) override;
/**
* Function OnTWResetButtonClick
* Called when the user clicks the reset button. This sets
* the parameters to their default values.
*/
void OnTWResetButtonClick( wxCommandEvent& event ) override;
/**
* Function TWCalculateWidth
* Calculate track width required based on given current and temperature rise.
*/
double TWCalculateWidth(
double aCurrent, double aThickness, double aDeltaT_C, bool aUseInternalLayer );
/**
* Function TWCalculateCurrent
* Calculate maximum current based on given width and temperature rise.
*/
double TWCalculateCurrent(
double aWidth, double aThickness, double aDeltaT_C, bool aUseInternalLayer );
/**
* Function TWDisplayValues
* Displays the results of a calculation (including resulting values such
* as the resistance and power loss).
*/
void TWDisplayValues( double aCurrent, double aExtWidth, double aIntWidth, double aExtThickness,
double aIntThickness );
/**
* Function TWUpdateModeDisplay
* Updates the fields to show whether the maximum current, external trace
* width, or internal trace width is currently the controlling parameter.
*/
void TWUpdateModeDisplay();
// Via size calculations
/**
* Function VS_Init
* Read config and init dialog widgets values
*/
void VS_Init();
/**
* Function VS_WriteConfig
* Write Via Size parameters in config
*/
void VS_WriteConfig();
/**
* Function OnViaCalculate
* Called when the user changes any value in the via calcultor.
*/
void OnViaCalculate( wxCommandEvent& event ) override;
/**
* Function OnViaEpsilonR_Button
*/
void OnViaEpsilonR_Button( wxCommandEvent& event ) override;
/**
* Function OnViaRho_Button
*/
void OnViaRho_Button( wxCommandEvent& event ) override;
/**
* Update the Error message in Via calculation panel
*/
void onUpdateViaCalcErrorText( wxUpdateUIEvent& event ) override;
/**
* Function OnViaResetButtonClick
* Called when the user clicks the reset button. This sets
* the parameters to their default values.
*/
void OnViaResetButtonClick( wxCommandEvent& event ) override;
/**
* Function VSDisplayValues
* Displays the results of the calculation.
*/
void VSDisplayValues( double aViaResistance, double aVoltageDrop, double aPowerLoss,
double aEstimatedAmpacity, double aThermalResistance, double aCapacitance,
double aTimeDegradation, double aInductance, double aReactance );
// Electrical spacing panel:
void OnElectricalSpacingUnitsSelection( wxCommandEvent& event ) override;
void OnElectricalSpacingRefresh( wxCommandEvent& event ) override;
void ElectricalSpacingUpdateData( double aUnitScale );
// Transline functions:
/**
* Function OnTranslineSelection
* Called on new transmission line selection
*/
void OnTranslineSelection( wxCommandEvent& event ) override;
/**
* Function OnTransLineResetButtonClick
* Called when the user clicks the reset button. This sets
* the parameters to their default values.
*/
void OnTransLineResetButtonClick( wxCommandEvent& event ) override;
/**
* Function OnTranslineAnalyse
* Run a new analyse for the current transline with current parameters
* and displays the electrical parameters
*/
void OnTranslineAnalyse( wxCommandEvent& event ) override;
/**
* Function OnTranslineSynthetize
* Run a new synthezis for the current transline with current parameters
* and displays the geometrical parameters
*/
void OnTranslineSynthetize( wxCommandEvent& event ) override;
/**
* Function OnTranslineEpsilonR_Button
* Shows a list of current relative dielectric constant(Er)
* and set the selected value in main dialog frame
*/
void OnTranslineEpsilonR_Button( wxCommandEvent& event ) override;
/**
* Function OnTranslineTanD_Button
* Shows a list of current dielectric loss factor (tangent delta)
* and set the selected value in main dialog frame
*/
void OnTranslineTanD_Button( wxCommandEvent& event ) override;
/**
* Function OnTranslineRho_Button
* Shows a list of current Specific resistance list (rho)
* and set the selected value in main dialog frame
*/
void OnTranslineRho_Button( wxCommandEvent& event ) override;
/**
* Function TranslineTypeSelection
* Must be called after selection of a new transline.
* Update all values, labels and tool tips of parameters needed
* by the new transline
* Irrelevant parameters texts are blanked.
* @param aType = the TRANSLINE_TYPE_ID of the new selected transline
*/
void TranslineTypeSelection( enum TRANSLINE_TYPE_ID aType );
/**
* Function TransfDlgDataToTranslineParams
* Read values entered in dialog frame, and transfert these
* values in current transline parameters, converted in normalized units
*/
void TransfDlgDataToTranslineParams();
// Color Code panel
void OnToleranceSelection( wxCommandEvent& event ) override;
void ToleranceSelection( int aSelection );
// Attenuators Panel
void OnAttenuatorSelection( wxCommandEvent& event ) override;
void SetAttenuator( unsigned aIdx );
void OnCalculateAttenuator( wxCommandEvent& event ) override;
void TransfPanelDataToAttenuator();
void TransfAttenuatorDataToPanel();
void TransfAttenuatorResultsToPanel();
// Regulators Panel
void OnRegulatorCalcButtonClick( wxCommandEvent& event ) override;
void OnRegulatorResetButtonClick( wxCommandEvent& event ) override;
void OnRegulTypeSelection( wxCommandEvent& event ) override;
void OnRegulatorSelection( wxCommandEvent& event ) override;
void OnDataFileSelection( wxCommandEvent& event ) override;
void OnAddRegulator( wxCommandEvent& event ) override;
void OnEditRegulator( wxCommandEvent& event ) override;
void OnRemoveRegulator( wxCommandEvent& event ) override;
/**
* Function RegulatorPageUpdate:
* Update the regulator page dialog display:
* enable the current regulator drawings and the formula used for calculations
*/
void RegulatorPageUpdate();
/**
* Function SelectLastSelectedRegulator
* select in choice box the last selected regulator
* (name in m_lastSelectedRegulatorName)
* and update the displayed values.
* if m_lastSelectedRegulatorName is empty, just calls
* RegulatorPageUpdate()
*/
void SelectLastSelectedRegulator();
void RegulatorsSolve();
/**
* Write regulators parameters in config
* @param aCfg is the config settings
*/
void Regulators_WriteConfig( PCB_CALCULATOR_SETTINGS* aCfg );
public:
// Read/write params values and results
/**
* Function SetPrmValue
* Read/write params values and results
* @param aPrmId = param id to write
* @param aValue = valmue to write
*/
void SetPrmValue( enum PRMS_ID aPrmId, double aValue );
/**
* Function SetResult
* Puts the text into the given result line.
* @param aLineNumber = the line (0 to 5) wher to display the text
* @param aText = the text to display
*/
void SetResult( int aLineNumber, const wxString& aText );
/** Function SetPrgmBgColor
* Set the background color of a parameter
* @param aPrmId = param id to set
* @param aCol = new color
*/
void SetPrmBgColor( enum PRMS_ID aPrmId, const KIGFX::COLOR4D* aCol );
/**
* Function GetPrmValue
* Returns a param value.
* @param aPrmId = param id to write
* @return the value always in normalized unit (meter, Hz, Ohm, radian)
*/
double GetPrmValue( enum PRMS_ID aPrmId );
/**
* Function IsPrmSelected
* @return true if the param aPrmId is selected
* Has meaning only for params that have a radio button
*/
bool IsPrmSelected( enum PRMS_ID aPrmId );
// Board classes panel:
void OnBoardClassesUnitsSelection( wxCommandEvent& event ) override;
void BoardClassesUpdateData( double aUnitScale );
// Calculator doesn't host a tool framework
wxWindow* GetToolCanvas() const override
{
return nullptr;
}
};
extern const wxString DataFileNameExt;
#endif // PCB_CALCULATOR_H