/* * This program source code file is part of KICAD, a free EDA CAD application. * * Copyright (C) 1992-2021 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 . */ #ifndef PCB_CALCULATOR_H #define PCB_CALCULATOR_H #include "transline/transline.h" // Included for SUBST_PRMS_ID definition. #include "transline_ident.h" #include "pcb_calculator_frame_base.h" #include "attenuators/attenuator_classes.h" #include "class_regulator_data.h" extern const wxString PcbCalcDataFileExt; class APP_SETTINGS_BASE; class KIWAY; class PCB_CALCULATOR_SETTINGS; /** * PCB calculator the main frame. */ class PCB_CALCULATOR_FRAME : public PCB_CALCULATOR_FRAME_BASE { public: PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ); ~PCB_CALCULATOR_FRAME(); /** * Read/write params values and results. * * @param aPrmId is the parameter id to write. * @param aValue is the value to write. */ void SetPrmValue( enum PRMS_ID aPrmId, double aValue ); /** * Put the text into the given result line. * * @param aLineNumber is the line (0 to 5) where to display the text. * @param aText is the text to display. */ void SetResult( int aLineNumber, const wxString& aText ); /** * Set the background color of a parameter. * * @param aPrmId is the parameter id to set. * @param aCol is the new color. */ void SetPrmBgColor( enum PRMS_ID aPrmId, const KIGFX::COLOR4D* aCol ); /** * Return a param value. * * @param aPrmId is the parameter id to write. * @return the value always in normalized unit (meter, Hz, Ohm, radian). */ double GetPrmValue( enum PRMS_ID aPrmId ) const; /** * @return true if the parameter aPrmId is selected. */ bool IsPrmSelected( enum PRMS_ID aPrmId ) const; // 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; } private: // Event handlers void OnClosePcbCalc( wxCloseEvent& event ) override; void OnUpdateUI( wxUpdateUIEvent& 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 is the full filename, with or without extension. */ void SetDataFilename( const wxString& aFilename ); /** * Panel-specific initializers */ void initTrackWidthPanel(); void initESeriesPanel(); void initColorCodePanel(); void initViaSizePanel(); /** * 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 OnESeriesSelection( wxCommandEvent& event ) override; /** * Write track width parameters in configuration. */ void writeTrackWidthConfig(); /** * Update the calculations the user changes the general parameters. */ void OnTWParametersChanged( wxCommandEvent& event ) override; /** * Update the calculations when the user changes the desired maximum current. */ void OnTWCalculateFromCurrent( wxCommandEvent& event ) override; /** * Update the calculations when the user changes the desired external trace width. */ void OnTWCalculateFromExtWidth( wxCommandEvent& event ) override; /** * Update the calculations when the user changes the desired internal trace width. */ void OnTWCalculateFromIntWidth( wxCommandEvent& event ) override; /** * Update the calculations when the user clicks the reset button. */ void OnTWResetButtonClick( wxCommandEvent& event ) override; /** * Calculate track width required based on given current and temperature rise. */ double TWCalculateWidth( double aCurrent, double aThickness, double aDeltaT_C, bool aUseInternalLayer ); /** * Calculate maximum current based on given width and temperature rise. */ double TWCalculateCurrent( double aWidth, double aThickness, double aDeltaT_C, bool aUseInternalLayer ); /** * Display 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 ); /** * Update the fields to show whether the maximum current, external trace * width, or internal trace width is currently the controlling parameter. */ void TWUpdateModeDisplay(); /** * Write via size parameters in configuration. */ void writeViaSizeConfig(); /** * Called when the user changes any value in the via calculator. */ void OnViaCalculate( wxCommandEvent& event ) override; void OnViaEpsilonR_Button( wxCommandEvent& event ) override; void OnViaRho_Button( wxCommandEvent& event ) override; /** * Update the Error message in via calculation panel. */ void onUpdateViaCalcErrorText( wxUpdateUIEvent& event ) override; /** * Called when the user clicks the reset button; sets the parameters to their default values. */ void OnViaResetButtonClick( wxCommandEvent& event ) override; /** * Display 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 ); /** * Called on new transmission line selection. */ void OnTranslineSelection( wxCommandEvent& event ) override; /** * Called when the user clicks the reset button; sets the parameters to their default values. */ void OnTransLineResetButtonClick( wxCommandEvent& event ) override; /** * Run a new analyze for the current transline with current parameters and displays the * electrical parameters. */ void OnTranslineAnalyse( wxCommandEvent& event ) override; /** * Run a new synthesis for the current transline with current parameters and displays the * geometrical parameters. */ void OnTranslineSynthetize( wxCommandEvent& event ) override; /** * Shows a list of current relative dielectric constant(Er) and set the selected value in * main dialog frame. */ void OnTranslineEpsilonR_Button( wxCommandEvent& event ) override; /** * Show a list of current dielectric loss factor (tangent delta) and set the selected value * in main dialog frame. */ void OnTranslineTanD_Button( wxCommandEvent& event ) override; /** * Show a list of current Specific resistance list (rho) and set the selected value in main * dialog frame. */ void OnTranslineRho_Button( wxCommandEvent& event ) override; /** * 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 are blanked. * * @param aType is the #TRANSLINE_TYPE_ID of the new selected transmission line. */ void TranslineTypeSelection( enum TRANSLINE_TYPE_ID aType ); /** * Read values entered in dialog frame, and transfer 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; /** * Update the regulator page dialog display. * * Enable the current regulator drawings and the formula used for calculations. */ void RegulatorPageUpdate(); /** * If m_lastSelectedRegulatorName is empty, just calls RegulatorPageUpdate() */ void SelectLastSelectedRegulator(); void RegulatorsSolve(); /** * Write regulators parameters in configuration. * * @param aCfg is the configuration settings. */ void Regulators_WriteConfig( PCB_CALCULATOR_SETTINGS* aCfg ); public: REGULATOR_LIST m_RegulatorList; // the list of known regulator private: bool m_RegulatorListChanged; // Set when m_RegulatorList is modified and the corresponding 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; std::vector m_transline_list; ATTENUATOR* m_currAttenuator; std::vector m_attenuator_list; wxString m_lastSelectedRegulatorName; wxBitmap* m_ccValueNamesBitmap; wxBitmap* m_ccValuesBitmap; wxBitmap* m_ccMultipliersBitmap; wxBitmap* m_ccTolerancesBitmap; int m_lastNotebookPage; bool m_macHack; }; extern const wxString DataFileNameExt; #endif // PCB_CALCULATOR_H