1 /* 2 * transline.h - base for a transmission line class definition 3 * 4 * Copyright (C) 2005 Stefan Jahn <stefan@lkcc.org> 5 * Modifications 2018 for Kicad: Jean-Pierre Charras 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 2 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this package; see the file COPYING. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 20 * Boston, MA 02110-1301, USA. 21 * 22 */ 23 24 #ifndef __TRANSLINE_H 25 #define __TRANSLINE_H 26 27 #include <gal/color4d.h> 28 29 #define TRANSLINE_OK 0 30 #define TRANSLINE_WARNING 1 31 #define TRANSLINE_ERROR 2 32 33 // IDs for lines parameters used in calculation: 34 // (Used to retrieve these parameters from UI. 35 // DUMMY_PRM is used to skip a param line in dialogs. It is not really a parameter 36 enum PRMS_ID 37 { 38 UNKNOWN_ID = -1, 39 EPSILONR_PRM, // dielectric constant 40 TAND_PRM, // Dielectric Loss Tangent 41 RHO_PRM, // Conductivity of conductor 42 H_PRM, // height of substrate 43 TWISTEDPAIR_TWIST_PRM, // Twists per length 44 H_T_PRM, 45 STRIPLINE_A_PRM, // Stripline : distance from line to top metal 46 T_PRM, // thickness of top metal 47 ROUGH_PRM, 48 MUR_PRM, // magnetic permeability of substrate 49 TWISTEDPAIR_EPSILONR_ENV_PRM, 50 MURC_PRM, // magnetic permeability of conductor 51 FREQUENCY_PRM, // Frequency of operation 52 Z0_PRM, // characteristic impedance 53 Z0_E_PRM, 54 Z0_O_PRM, 55 ANG_L_PRM, // Electrical length in angle 56 PHYS_WIDTH_PRM, 57 PHYS_DIAM_IN_PRM, // Inner diameter of cable 58 PHYS_S_PRM, // width of gap between line and ground 59 PHYS_DIAM_OUT_PRM, // Outer diameter of cable 60 PHYS_LEN_PRM, // Length of cable 61 DUMMY_PRM 62 }; 63 64 65 // IDs for lines parameters used in calculation that are not given by the UI 66 enum EXTRA_PRMS_ID 67 { 68 EXTRA_PRMS_START = DUMMY_PRM - 1, 69 SIGMA_PRM, // Conductivity of the metal 70 SKIN_DEPTH_PRM, // Skin depth 71 LOSS_DIELECTRIC_PRM, // Loss in dielectric (dB) 72 LOSS_CONDUCTOR_PRM, // Loss in conductors (dB) 73 CUTOFF_FREQUENCY_PRM, // Cutoff frequency for higher order modes 74 EPSILON_EFF_PRM, // Effective dielectric constant 75 EXTRA_PRMS_COUNT, 76 }; 77 78 class TRANSLINE 79 { 80 public: 81 TRANSLINE(); 82 virtual ~TRANSLINE(); 83 84 const char* m_Name; 85 void setProperty( enum PRMS_ID aPrmId, double aValue ); 86 double getProperty( enum PRMS_ID aPrmId ); 87 88 89 void getProperties(); 90 void checkProperties(); 91 void setResult( int, double, const char* ); 92 void setResult( int, const char* ); 93 bool isSelected( enum PRMS_ID aPrmId ); 94 95 void Init(); 96 virtual void synthesize(); calc()97 virtual void calc() {} 98 99 /** 100 * Computation for analysis 101 */ calcAnalyze()102 virtual void calcAnalyze(){}; 103 104 /** 105 * Computation for synthesis 106 **/ calcSynthesize()107 virtual void calcSynthesize() {} 108 109 /** 110 * Shows synthesis results and checks for errors / warnings. 111 **/ showAnalyze()112 virtual void showAnalyze() {} 113 114 /** 115 * Shows analysis results and checks for errors / warnings. 116 **/ showSynthesize()117 virtual void showSynthesize() {} 118 119 /** 120 * Shows results 121 **/ show_results()122 virtual void show_results() {} 123 124 void analyze(); 125 126 KIGFX::COLOR4D errCol = KIGFX::COLOR4D( 1, 0.63, 0.63, 1 ); 127 KIGFX::COLOR4D warnCol = KIGFX::COLOR4D( 1, 1, 0.57, 1 ); 128 KIGFX::COLOR4D okCol = KIGFX::COLOR4D( 1, 1, 1, 1 ); 129 130 protected: 131 double m_parameters[EXTRA_PRMS_COUNT]; 132 double len; // length of line 133 double er_eff; // effective dielectric constant 134 double ang_l; // Electrical length in angle 135 136 bool minimizeZ0Error1D( double* ); 137 double skin_depth(); 138 void ellipke( double, double&, double& ); 139 double ellipk( double ); 140 void setErrorLevel( PRMS_ID, char ); 141 }; 142 143 #endif /* __TRANSLINE_H */ 144